Q2hhbmdlcyBpbiBDVlMgLSAKLSBuYW5vLmg6CgktIFNldCBDVVRfVE9fRU5EIHRvIGEgZGlmZmVyZW50IGJpdCB0aGFuIFRFTVBfT1BULiAgRml4ZXMgYnVnICMzMi4KLSBjdXQuYzoKICBkb19jdXRfdGV4dCgpCgktIEFkZGVkIGNoZWNrIGZvciBNQVJLX0lTU0VUIHdoZW4gdXNpbmcgQ1VUX1RPX0VORC4gIEZpeGVzIGJ1ZyAjMzEuCi0gZmlsZXMuYzoKICB3cml0ZV9maWxlKCkKCS0gUmVtb3ZlZCAocmVkdW5kYW50KSBjaGVjayBmb3Igd3JpdGluZyBvdXQgZmlsZXMgd2l0aCAtdC4KICBkb193cml0ZW91dCgpCgktIENoYW5nZWQgY2hlY2sgZm9yIGZpbGVuYW1lIHRvIGZpbGVuYW1lWzBdLiAgQWRkZWQgc29tZSBjb2RlLCAKCSAgb3ZlcmFsbCBmaXhlcyBidWcgIzMwID0tKQoKbmFuby0wLjkuMTMgLSAwNy8yMy8yMDAwCi0gSW1wbGVtZW50ZWQgUGljbydzIC1rIG1vZGUuICBOZXcgZmxhZyBDVVRfVE9fRU5ELCBvcHRpb24gKC1rLCAtLWN1dCksIAogIGFmZmVjdHMgZG9fY3V0X3RleHQgaW4gY3V0LmMuICBOb3QgYXZhaWxhYmxlIHdpdGggU01BTExfTkFOTyBiZWNhdXNlIGl0CiAgZGVwZW5kcyBvbiB0aGUgbWFya2VyIGNvZGUgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSB3aXRoIHRoYXQgc2V0dGluZy4KLSBDaGFuZ2VkIHN0YXRpYyB0ZW1wX29wdCB0byBmbGFnIFRFTVBfT1BULiAgRml4ZWQgYnVnICMyOSAodXNpbmcKICAtdCB3aXRoIGFuIHVud3JpdGFibGUgZmlsZSBjYXVzZXMgdXNlcnMgdG8gZ2V0IGxvY2tlZCBpbnRvIGVkaXRvcikuCi0gbW92ZS5jCiAgcGFnZV9kb3duKCkKCS0gRG9uJ3QgZWRpdF9yZWZyZXNoKCkgaWYgdGhlIGJvdHRvbSBvZiB0aGUgZmlsZSBpcyBpbiB0aGUgZWRpdAoJICBidWZmZXIuIChBZGFtKQotIG5hbm8uYzoKICBtYWluKCk6CgktIFRBQlNJWkUgbm93IHNldCBiZWZvcmUgZmlyc3QgY2FsbCB0byBlZGl0X3JlZnJlc2ggKEJpbGwgU291ZGFuKQoJLSBEaWZmZXJlbnQgXkMga2lsbCBjb2RlIChwYXRjaCBieSBDaHJpc3RpYW4gV2Vpc2dlcmJlcikuCiAgZGllKCk6CgktIE1vcmUgaW50ZWxsaWdlbnQgZW1lcmdlbmN5LXNhdmUgZmlsZW5hbWUgc2VsZWN0aW9uIChSb2IpCiAgZG9fc3BlbGwoKToKCS0gQ2hhbmdlZCBleGl0IHNlbWFudGluY3MgYSBiaXQgc28gdGhhdCBhc3BlbGwgd291bGRuJ3QgZ2V0CgkgIGFsbCBzY3Jld3kgKGJ1ZyBkaXNvdmVyZWQgYnkgSm9zaHVhIEplbnNlbi4KLSBmaWxlcy5jOgogIHJlYWRfZmlsZSgpOgoJLSBBZGRlZCBpbml0IG9mIGJ1ZiB2YXJpYWJsZSwgaG9wZWZ1bGx5IHRoaXMgd2lsbCBzdG9wIHRoZSAKCSAgImJsZWVkaW5nIiBvZiB0ZXh0IHNlZW4gd2l0aCBtdXR0IGFuZCB1c2luZyBpMThuLgogIHdyaXRlX2ZpbGUoKToKCS0gQWRkZWQgY29kZSB0byBjaGVjayB0byBzZWUgaWYgdXNpbmcgLWwgYW5kIHRoZSBmaWxlIGlzIG5vdAoJICBpbiBmYWN0IGEgbGluay4gIFRoaXMgc2hvdWxkIGZpeCB0aGUgYmVoYXZpb3Igd2hlcmUgYSBmaWxlCgkgIHRoYXQgZG9lcyBub3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIGJ1dCBjb3VsZCBiZSByZW1vdmVkIGFuZAoJICByZXdyaXR0ZW4gaXMgc2F2ZWQgd2l0aG91dCBlcnJvci4gIFBsZWFzZSB0ZXN0IHRoaXMgZmVhdHVyZQoJICBhbmQgZ2l2ZSBmZWVkYmFjay4KLSBzZWFyY2guYzoKICBzZWFyY2hfaW5pdCgpOgoJLSBBZGRlZCAiICh0byByZXBsYWNlKSIgc3RhdGVtZW50IHRvIGVuZCBvZiBzZWFyY2ggc3RyaW5nIGlmIAoJICB3ZSBhcmUgZG9pbmcgYSByZXBsYWNlLiAgTWFudWFsbHkgY29udmVydGVkIGFsbCB0aGUgdHJhbnNsYXRpb25zCgkgIGZyb20gJyVzJyB0byAnJXMlcycgdG8gZW5zdXJlIHRoZXkgc3RpbGwgd29yayB3aXRoIHRoZSBuZXcgY29kZS4KCSAgQWxzbyBwdXQgaW4gdGhlIHRyYW5zbGF0aW9uIGZvciAiIChyZXBsYWNlKSIgaW4gdGhlIC5wbydzLiAgSG9wZQoJICBJIGRpZG4ndCBzdGVwIG9uIHlvdXIgdG9lcyBkb2luZyB0aGlzIEpvcmRpLiAoQ2hyaXMpCiAgZG9fc2VhcmNoKCksIGRvX3JlcGxhY2UoKToKCS0gUmVtb3ZlZCBjYWxsIHRvIHNlYXJjaF9hYm9ydCgpL3JlcGxhY2VfYWJvcnQoKSBiZWZvcmUgY2FsbCB0bwoJICB0aGUgb3Bwb3NpdGUgZnVuY3Rpb24uCgktIEZpeGVkIGJ1ZyAjMjguCiAgZmluZG5leHRzdHIoKQoJLSBkbyBub3QgY2VudGVyIHN0cmluZyBmb3VuZCBpZiBpdCBpcyBjdXJyZW50bHkgdmlzYWJsZS4gKEFkYW0pCi0gZnIucG86CgktIEZyZW5jaCB1cGRhdGUgYnkgQ2xlbWVudCBMYWZvcmV0IDxjbGVtX2xhZkB3YW5hZG9vLmZyPi4KLSBlcy5wbzoKCS0gVXBkYXRlZCBzdHJpbmdzIHRvIDAuOS4xMyAoSm9yZGkpLgoKbmFuby0wLjkuMTIgLSAwNy8wNy8yMDAwCi0gYWxsOgoJLSBOZXcgcmVnZXhwIHNlYXJjaCBmZWF0dXJlIGJ5IEJpbGwgU291ZGFuLiAgTmV3IGZsYWdzIFVTRV9SRUdFWFAKCSAgYW5kIFJFR0VYUF9DT01QSUxFRCwgbmV3IGZ1bmN0aW9ucyByZWdleHBfaW5pdCwgcmVnZXhwX2NsZWFudXAKCSAgcmVwbGFjZV9saW5lLCByZXBsYWNlX3JlZ2V4cCBpbiBzZWFyY2guYywgY2hhbmdlcyB0bwoJICBzZWFyY2hfaW5pdCgpIGFuZCBkb19yZXBsYWNlKCkgYW5kIHN0cnN0cndyYXBwZXIoKS4gCgktIEFkZGVkIF9QT1NJWF9WRVJTSU9OIGNoZWNrIHRvIHJlZ2V4cCBjb2RlLiAgQmV0dGVyIHRoYW4gbm90aGluZwoJICBmb3Igbm9uLVBPU0lYIHN5c3RlbXMuLi4KCS0gTWFkZSBzZWFyY2ggZnVuY3Rpb25zICYga2V5cyBtb3JlIGxpa2UgUGljby4gIEFkZGVkIGdvdG8gbGluZSBmcm9tICAKCSAgc2VhcmNoIGFuZCByZXBsYWNlIGZ1bmN0aW9uLCBjaGFuZ2VkIHdvcmRpbmcgdG8gIk5vIFJlcGxhY2UiIGluc3RlYWQKCSAgb2YgIlRvIFNlYXJjaCIsICJUbyBSZXBsYWNlIiB0byBzaW1wbHkgIlJlcGxhY2UiLCBhbmQgY2hhbmdlZCB0bwoJICBQaWNvJ3Mga2V5c3Ryb2tlIGJ5IGRlZmF1bHQsIF5SLiBBZmZlY3RzIHNlYXJjaF9pbml0KCksCgkgIGRvX3NlYXJjaCgpIGluIHNlYXJjaC5jLCBnbG9iYWxzIGluIG5hbm8uaCBhbmQKCSAgc2hvcnRjdXRfaW5pdCgpIGluIGdsb2JhbC5jLgoJLSBjaGFuZ2VkICdzcHJpbnRmJyBjYWxscyB0byBzYWZlciAnc25wcmludGYnIChSb2IpCi0gY3V0LmMKCS0gZnVydGhlciB0b3RzaXplIHVwZGF0ZSBjb3JyZWN0aW9ucwotIGZpbGVzLmM6CgktIGNoYW5nZWQgZG9faW5zZXJ0ZmlsZSB0byBjYWxsIGZpeF9lZGl0Ym90IChSb2IpCgktIE1hZ2ljIExpbmUgY29kZSBpbiByZWFkX2ZpbGUgKFJvYikKLSBuYW5vLmM6CgktIFJlbW92ZWQgZHVhbCBhbHRfc3BlbGxlciB2YXJpYWJsZXMsIG9vcHMhIChSb2NjbyBDb3JzaSkKCS0gUmVtb3ZlZCB1bm5lY2Vzc2FyeSBkb19vbGRzcGVsbCBmdW5jdGlvbiAoUm9jY28gQ29yc2kpLiAgQWRkZWQKCSAgU01BTExfTkFOTyAjaWZkZWYgYXJvdW5kIGFjdHVhbCBzcGVsbCBmdW5jdGlvbi4KCS0gTW92ZWQgcGFnZV91cCgpIHRvIG1vdmUuYyB3aGVyZSBpcyBiZWxvbmdzLgoJLSBDb3JyZWN0ZWQgRklYTUUgaW4gZG9fZW50ZXIgd2l0aCBleHBsYW5hdGlvbi4gKFJvYikKCS0gRml4ZWQgRklYTUUgaW4gZG9fanVzdGlmeSwgcmVzdWx0ZWQgaW4gY3JlYXRpb24gb2YKCSAgZml4X2VkaXRib3QgW2Fsc28gZml4ZWQgaW4gZG9fZW50ZXJdICh3aW5pby5jKSAoUm9iKQogIGhlbHBfaW5pdCgpOgoJLSBNb3ZlZCBuZXdsaW5lIG91dCBvZiBpZiBzdGF0ZW1lbnQgKFJvY2NvIENvcnNpKQogIGRvX2NoYXIoKToKCS0gTWFnaWMgTGluZSByZWxhdGVkIGNvZGUgaW4gZG9fY2hhciAoUm9iKQogIGRvX2JhY2tzcGFjZSgpLCBkb19kZWxldGUoKToKCS0gQWRkZWQgbWFnaWMgbGluZSBjb2RlIGhlcmUgdG9vLgoKLSBkZS5wbzoKCS0gUmV2aXNlZCB0cmFuc2xhdGlvbnMgYnkgZmxva2lAYmlnZm9vdC5jb20uCi0gZmkucG86CgktIEZpbm5pc2ggdHJhbnNsYXRpb24gYnkgcGF1bGkudmlydGFuZW5Ac2F1bmFsYWh0aS5maS4KLSB1dGlscy5jOgoJLSBBZGRlZCBuZXdfbWFnaWNsaW5lKCkKLSB3aW5pby5jOgoJLSBBZGRlZCBzdGRsaWIuaCB0byBpbmNsdWRlcywgZm91bmQgYnkgT3BlbkJTRCBnY2MuCgktIGxvdHMgb2YgbmV3IGNvbW1lbnRpbmcgYXJvdW5kIGRpc3BsYXkgZnVuY3Rpb25zCiAgZG9feWVzbm8oKSwgbmFub2dldHN0cigpOgoJLSBSZW1vdmVkIG5vdyB1bm5lY2Vzc2FyeSByYXcvY2JyZWFrIGNvbWJvcy4KCS0gUmVtb3ZlZCBnZXR0ZXh0IGNhbGxzIGZyb20gIlkoZXMpIiwgIk4obykiLCAiQShsbCkiIGFuZCAiXkMiLCB0aWxsCgkgIHdlIGRlY2lkZSBpZiB0aG9zZSBrZXliaW5kaW5ncyBzaG91bGQgYmUgdHJhbnNsYXRlZC4gKEpvcmRpKQogIGNsZWFyX2JvdHRvbXdpbigpOgoJLSBSZW1vdmVkIHdyZWZyZXNoKGVkaXQpIGNhbGwuCiAgZWRpdF91cGRhdGVfdG9wKCk6CgktIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIG5hbm8gdG8gbm90IHVwZGF0ZSB3aGVuCgkgIGN1cnJlbnQtPm5leHQgPT0gTlVMTCAoZS5nLiBwYWdpbmcgZG93biB0byB0aGUgdmVyeSBib3R0b20gb2YgCgkgIEFCT1VUIE5MUyB3b3VsZG4ndCB3b3JrKS4KICBmaXhfZWRpdGJvdDoKCS0gQWRkZWQgKHNob3VsZCByZWJ1aWxkIGVkaXRib3QgZnJvbSBhIHZhbGlkIGVkaXR0b3ApIChSb2IpCiAgZWRpdF9hZGQ6CgktIHJlbW92YWwgb2YgcmVkdW5kYW50IGNhbGwgdG8gbXZ3YWRkbnN0cgoKbmFuby0wLjkuMTEgLSAwNi8yMC8yMDAwCi0gTmV3IGZsYWcgIi1UIiBvciAiLS10YWJzaXplIiB0byBzcGVjaWZ5IGhvdyB0byBkaXNwbGF5IHRhYiB3aWR0aHMuCiAgQWZmZWN0cyBtYWluKCkgaW4gbmFuby5jLCBzdHJsZW5wdCgpLCB4cHQoKSBhbmQgYWN0dWFsX3goKSAoZXQgYWwpIGluIAogIHdpbmlvLmMsIGFuZCBuYW5vLmguICBNYW55IGhhcmNvZGVkICI4InMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gdGhlIAogIFRBQlNJWkUgaW50LiAgQWRkZWQgY2hhbmdlcyB0byBuYW5vLjEgYW5kIG5hbm8uMS5odG1sLgotIGlkLnBvOgoJLSBJbmRvbmVzaWFuIHRyYW5zbGF0aW9uIGJ5IFRlZGkgSGVyaXlhbnRvLgotIGVzLnBvOgoJLSBVcGRhdGVkIHRyYW5zbGF0aW9uIChKb3JkaSBNYWxsYWNoKS4KLSB3aW5pby5jCiAgICAgICAgLSBSZXdyaXRlIG9mIGRpc3BsYXkgZnVuY3Rpb25zIHRvIGNvcnJlY3QgdGhlIGRpc3BsYXkgcHJvYmxlbXMgCgkgIHdlIGhhZCBiZWVuIHNlZWluZy4gQWZmZWN0czogYWRkX21hcmtlZF9zYW1lbGluZSwgZWRpdF9hZGQsCgkgIGFuZCBtYW55IG90aGVycy4gKFJvYiBTaWVtYm9yc2tpKQoJLSB0b3RzaXplIGZpeGVzIChSb2IgU2llbWJvcnNraSkKICB0b3RhbF9yZWZyZXNoKCk6CgktIEN1dCBkaXNwYWx5X21haW5fbGlzdCBjYWxsLCBhcyB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgc3VwcG9zZWQgdG8gcmVmcmVzaAoJICB3aGF0J3MgYWxyZWFkeSBvbiB0aGUgc2NyZWVuLCBub3QgZ28gdGhyb3VnaCB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgdGhlCgkgIHRleHQgYWdhaW4uCi0gY3V0LmM6CgktIHRvdHNpemUgZml4ZXMgKFJvYiBTaWVtYm9yc2tpKQotIG5hbm8uYzoKCS0gZXhwZXJpbWVudGFsIGRvX3dyYXAgYW5kIGNoZWNrX3dyYXAgKEFkYW0gUm9nb3lza2kpCgktIFJlbW92ZWQgZWRpdHdpbmVvYiwgYXMgaXQgd2FzIHJlZHVuZGFudCBmb3IgKGVkaXR3aW5yb3dzIC0gMSkuCgkgIENoYW5nZWQgYWxsIGNhbGxzIHRvIGVkaXR3aW5yb3dzIC0gMSBpbiBuYW5vLmMgYW5kIG1vdmUuYy4KCS0gUmVtb3ZlZCBhbGwgZnVuY3Rpb25zIHRoYXQgd2VyZSBzcGxpdCBpbnRvIG90aGVyIGZpbGVzLgoJICBBZmZlY3RzIExPVFMgb2YgZnVuY3MuCiAgZG9fZW50ZXIoKToKICAgICAgICAtIEFkZGVkIHJlc2V0IG9mIHBsYWNld2V3YW50IHRvIGVuZC4KICBkb19pbnNlcnRmaWxlKCk6CgktIEZpeCBkaXNwbGF5IHByb2JsZW0gd2hlbiB1c2luZyBjdHJsLXIgdG8gbG9hZCBhIGZpbGUKCSAgaW50byB0aGUgYnVmZmVyIChSb2IgU2llbWJvcnNraSkKICBoYW5kbGVfc2lnd2luY2goKToKCS0gQWRkZWQgdGl0bGViYXIoKSwgZWRpdF9yZWZyZXNoKCkgYW5kIGRpc3BsYXlfbWFpbl9saXN0KCkgY2FsbHMgYmVjYXVzZQoJICBhIHJlc2l6ZSB3YXNuJ3QgcGlja2luZyB1cCBvbiBwb3NzaWJsZSBkaWZmZXJlbnQgd2lkdGggY29ycmVjdGx5LgotIHV0aWxzLmM6CgktIE1vdmVkIG5tYWxsb2MoKSBhbmQgbnJlYWxsb2MoKSBoZXJlLgotIG1vdmUuYzoKCS0gTmV3IGZpbGUsIGNvbnRhaW5zIG1vdmVtZW50IGZ1bmN0aW9ucyAobGlrZSBkb19ob21lKCksIGRvX3VwKCksCgkgIGRvX2Rvd24oKSwgcGFnZV91cCgpLCBldGMuLi4pLgotIGZpbGVzLmM6CgktIENvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgZmlsZXMgKHJlYWRfZmlsZSwgaW5zZXJ0X2ZpbGUsCgkgIGRvX3dyaXRlb3V0KCksIGV0YykuCi0gc2VhcmNoLmM6CgktIENvbnRhaW5zIGFsbCBvdXIgc2VhcmNoaW5nIGFuZCByZWxhdGVkIGZ1bmN0aW9ucywgKGRvX3NlYXJjaCgpLAoJICBmaW5kbmV4dHN0cigpLCBkb19yZXBsYWNlKCksIGRvX2dvdG9saW5lKCkpLgoKbmFuby0wLjkuMTAgLSAwNi8wNC8yMDAwCi0gZXMucG86CgktIFRyYW5zbGF0aW9uIHVwZGF0ZXMgKEpvcmRpKS4KLSBBVVRIT1JTLCBuYW5vLjEuaHRtbCwgVE9ETywgUkVBRE1FOgoJLSBEb2N1bWVudGF0aW9uIGFuZCBlbWFpbCBhZGRyZXNzIHVwZGF0ZXMgKEpvcmRpKS4KLSBuYW5vLmM6CiAgbWFpbigpOgoJLSBNb3ZlZCBBZGFtJ3MgdGVybWlvIGNvZGUgZG93biB0byBhZnRlciBnZXRvcHQoKSBhbmQgYmVmb3JlIGluaXRzY3IoKQoJICB0byBzdG9wIHBlb3BsZSBsb3NpbmcgdGhlaXIgU0lHSU5UIGNoYXJhY3RlciB3aGVuIHVzaW5nIGFyZ3MgdGhhdAoJICBleGl0IG5hbm8gYmVmb3JlIGl0IHJ1bnMgKC0tdmVyc2lvbiwgLS1oZWxwLCBldGMpLgoKbmFuby0wLjkuOSAtIDA1LzMxLzIwMDAKLSBNYWtlaWxlLmFtOgoJLSBBZGRlZCBwcm9wZXIgbGluZXMgZm9yIGRlZmluaW5nIExPQ0FMRURJUi4KLSBjb25maWd1cmUuaW46CgktIFNwZWxsaW5nIGZpeGVzIChKb3JkaSBNYWxsYWNoKQoJLSBSZW1vdmVkIENGTEFHUyBjaGFuZ2VzIGZvciBnY2MsIHJlZHVjZXMgcG9ydGFiaWxpdHkgYWNjb3JkaW5nIHRvCgkgIHNvbWUsIGFuZCBpdCBjZXJ0YWlubHkgZG9lc24ndCBzZWVtIHRvIGRlY3JlYXNlIGV4ZSBzaXplLgotIGVzLnBvOgoJLSBTcGFuaXNoIHJhbnNsYXRpb24gdXBkYXRlcyAoSm9yZGkgTWFsbGFjaCkKLSBQT1RGSUxFUy5pbjoKCS0gQWRkZWQgZ2xvYmFsLmMgZmlsZSwgd2FzIHNjcmV3aW5nIHVwIHRyYW5zbGF0aW9ucyAoaS5lLiB0aGV5CgkgIHdlcmVuJ3QgZ2V0dGluZyBkb25lKS4KLSBjdXQuYzoKICBhZGRfdG9fY3V0YnVmZmVyKCk6CgktIEFkZGVkIHRvdHNpemUgaW5jcmVtZW50LgoJLSBDdXQgZml4ZXMgYW5kIG9wdGltaXphdGlvbnMgKFJvYiBTaWVtYm9yc2tpKS4KICBkb191bmN1dF90ZXh0KCk6CgktIEFkZGVkIHRvdHNpemUgaW5jcmVtZW50IGluIHNldmVyYWwgcGxhY2VzLgotIG5hbm8uYzoKICBoZWFkZXJzOgoJLSBSZW1vdmVkIExPQ0FMRURJUiBkZWZpbmUuCiAgZG9fanVzdGlmeSgpOgoJLSBBZGRlZCBlZGl0X3JlZnJlc2goKSBjYWxsIChidWcgZGlzY292ZXJlZCBieSBBZGFtKS4KICBwYWdlX2Rvd25fY2VudGVyKCk6CgktIEFkZGVkIGNhbGwgdG8gZWRpdF91cGRhdGUoY3VycmVudCkgZm9yIGxhc3QgY2FzZS4gIFJlbW92ZWQgCgkgIGluY3JlbWVudCBvZiBjdXJyZW50X3kgc2luY2UgaXQncyBub3cganVzdCB3YXN0ZWZ1bC4KICBkb19lbnRlcigpOgoJLSBBZGRlZCB0b3RzaXplIGluY3JlbWVudC4KICByZW51bWJlcigpLCByZW51bWJlcl9hbGwoKToKCS0gUmVtb3ZlZCB0b3RzaXplLS0gYW5kIHRvdHNpemUgaW5pdCBpbiByZW51bWJlcl9hbGwuCiAgZG9fbW91c2UoKToKCS0gQWRkZWQgZWRpdF9yZWZyZXNoKCkgY2FsbCB0byBzaG93IGhpbGlnaHQgdXBkYXRlcy4gIFJlbW92ZWQKCSAgdW5uZWNlc3Nhcnkgd3JlZnJlc2goZWRpdCkuCiAgbWFpbigpOgoJLSBNb3ZlZCB1cCBsb2NhbGUgY2FsbHMgc28gdGhhdCB0cmFuc2xhdGVkIC0taGVscCBtZXNzYWdlcyB3b3VsZAoJICBhY3R1YWxseSBnZXQgdHJhbnNsYXRlZC4KICBkb19iYWNrc3BhY2UoKSwgZG9fZGVsZXRlKCk6CgktIEFkZGVkIGRlY3JlbWVudCBvZiB0b3RzaXplLgogIGluaXRfaGVscF9tc2coKToKCS0gTmV3IGZ1bmN0aW9uLCBpbml0aWFsaXplcyBoZWxwIHRleHQgaWYgTkFOT19TTUFMTCBpc24ndCBzZXQgKGZpeGVzCgkgIGJyb2tlbiBpMThuKS4KICByZWFkX2ZpbGUoKToKCS0gbWFsbG9jIGNhbGwgY2hhbmdlZCB0byBubWFsbG9jIChSb2IgU2llbWJvcnNraSkuCi0gd2luaW8uYzoKICB0b3RhbF9yZWZyZXNoKCk6CgktIENvbXBsZXRlbHkgcmV3cm90ZSBmdW5jdGlvbiwgbm90IHF1aXRlIHNvIGJyYWluZGFtYWdlZCBub3cuCgpuYW5vLTAuOS44IC0gMDUvMTgvMjAwMAotIG5hbm8uYzoKICBtYWluKCk6CgktIEFkZGVkIGF3ZXNvbWUgY29kZSB0aGF0IGRpc2FibGVzIHRoZSBDSU5UUiBhbmQgQ1FVSVQgCgkgIGNoYXJhY3RlciAoQWRhbSBSb2dveXNraSkuICBSZW1vdmVkIHJhdygpL25vcmF3KCkgY2FsbHMgc28gdGhhdAoJICBuYW5vIGdldHMgaW5wdXQgaW4gJ25vcm1hbCcgbW9kZSwgd2hpY2ggaXMgdGhlIFJpZ2h0IFdheSh0bSkgdG8KCSAgZG8gaXQuIF5TLCBeWiBhbmQgXlEgbm93IHdvcmsgcHJvcGVybHkgYXMgYSByZXN1bHQsIGFzIHdlbGwgYXMKCSAgXkMuICBOZXcgdmFyaWFibGUgdGVybSwgZ2xvYmFsIGJhcmlhYmxlIG9sZHRlcm0gdG8gc2F2ZSBwcmV2aW91cwoJICB0ZXJtIHNldHRpbmdzLCBhbmQgY2hhbmdlcyB0byBmaW5pc2goKSBhbmQgZGllKCkuCgktIEFkZGVkIGV4dHJhICNpZmRlZnMgaW4gZ2V0b3B0IGNvZGUsIHNvIHRoYXQgYWJvdmUgY29kZSBhbmQKCSAgZmxhZyBpbml0IGlzIHJ1biBldmVuIGlmIEdFVE9QVF9MT05HIGlzIG5vdCAjZGVmaW5lZC4KCS0gQWRkZWQgbWVtc2V0IGxpbmUgYmVmb3JlIHNpZ2FjdGlvbnMuIChBZGFtIFJvZ295c2tpKQogIGRvX3N1c3BlbmQoKToKCSAgUmVtb3ZlZCBmdW5jdGlvbiwgc2VlIGFib3ZlIGZvciB3aHkuCi0gd2luaW8uYzoKICB1cGRhdGVfbGluZSgpLCBjZW50ZXJfY3Vyc29yKCk6CgktIFJlbW92ZWQgd3JlZnJlc2goZWRpdCkgZnJvbSBib3R0b20gb2YgZnVuY3Rpb25zLiAgd3JlZnJlc2gKCSAgc2hvdWxkIG5vdyBvbmx5IGJlIGNhbGxlZCBvbmNlLCBhdCB0aGUgYm90dG9tIG9mIHRoZSBtYWluKCkKCSAgbG9vcC4KLSBnbG9iYWwuYzoKICAgc2hvcnRjdXRfaW5pdCgpOgoJLSBSZW1vdmVkIHN1c3BlbmQgc2NfaW5pdCBjYWxsIGFuZCBzdXNwZW5kIG1lc3NhZ2UgYmVjYXVzZSBzdXNwZW5kIGlzIG5vCgkgIGxvbmdlciBuZWVkZWQgaW4gdGhlIHNob3J0Y3V0IGxpc3QgdG8gd29yayBwcm9wZXJseS4KICAgIApuYW5vLTAuOS43IC0gMDUvMTQvMjAwMAotIG5hbm8uYzoKICBkb19ob21lKCksIGRvX2VuZCgpOiAKCS0gQWRkZWQgY2FsbHMgdG8gdXBkYXRlX2xpbmUgZm9yIHRoZSBjdXJyZW50IGxpbmUsIGZpeGVzCgkgIGxhY2sgb2YgdXBkYXRlIChidWcgZGlzY292ZXJlZCBieSBBbGJlcnRvIEdhcmPtYSkuCiAgbWFpbigpOgoJLSBBZGRlZCBTRVQoRk9MTE9XX1NZTUxJTktTKSBiZWZvcmUgZ2V0b3B0IGNhbGwsIGZpeGVzIG5vdCAKCSAgZm9sbG93aW5nIHN5bWxpbmtzIGV2ZW4gd2hlbiAtbCBpc24ndCBzZXQsIGFuZCAibm8gY2hhbmdlcyIKCSAgZXJyb3Igd2hlbiBuYW5vIGlzIGNhbGxlZCBmcm9tIGNyb250YWIgLWUgKEFkYW0gUm9nb3lza2kpLgotIGN1dC5jOgogIGRvX2N1dF90ZXh0KCk6CgktIEFkZGVkIGVkaXRfdXBkYXRlX3RvcCB0byBjdXQgd2hlbiBtYXJrIGlzIHNldCwgZml4ZXMgbGFjayBvZgoJICBkaXNwbGF5IHVwZGF0ZSAoYnVnIGRpc2NvdmVyZWQgYnkgS2VuIFR5bGVyKS4KCm5hbm8tMC45LjYgLSAwNS8wOC8yMDAwCi0gTmV3IEl0YWxpYW4gdHJhbnNsYXRpb24gKGl0LnBvKSwgYnkgRGFuaWVsZSBNZWRyaS4KLSBuYW5vLmM6CiAgcGFnZV91cCgpLCBwYWdlX2Rvd24oKToKCS0gQWRkZWQgcmVzZXQgb2YgcGxhY2V3ZXdhbnQgdG8gMCwgYXMgaXQgc2hvdWxkIGJlLgogIGRvX3VwKCksIGRvX2Rvd24oKToKCS0gQWRkZWQgY2FsbCB0byB1cGRhdGVfbGluZSgpIGZvciBsaW5lIHdlIG1vdmUgZnJvbSBhbmQgbGluZSB3ZQoJICBtb3ZlIHRvLCBpbiBvcmRlciB0byBrZWVwIHRoZSBoaWdobGlnaHRpbmcgY29ycmVjdC4KICBkb193cmFwKCk6CgktIEFkZGVkIHZhciBjaG9wLCBuZXcgY29kZSB0byB3cmFwIGxpbmVzIG1vcmUgbGlrZSBQaWNvLCBtb3N0bHkuCgkgIFRISVMgU1RJTEwgREVGSU5JVEVMWSBORUVEUyBUTyBCRSBSRVdSSVRURU4hCi0gd2luaW8uYzoKICBkb19oZWxwKCk6CgktIEFkZGVkIGVkaXRfcmVmcmVzaCgpIGJlZm9yZSBleGl0LgogIHVwZGF0ZV9jdXJzb3IoKToKCS0gUmVtb3ZlZCBjdXJzb3IgdXBkYXRpbmcgd2hpY2ggcmVhbGx5IHdhc24ndCBuZWVkZWQgYW55d2F5LgogIGVkaXRfdXBkYXRlKCk6CgktIFJlbW92ZWQgeXVja3kgY29kZSB0aGF0IGRpZG4ndCB3b3JrLCB0aGlzIGZ1bmN0aW9uIG5vdyBqdXN0CgkgIGNvbXB1dGVzIGVkaXR0b3AgYW5kIGVkaXRib3QgYW5kIGNhbGxzIGVkaXRfcmVmcmVzaCgpIHRvIGRvIHRoZQoJICByZXN0LCB3aGljaCByZW1vdmVzIGEgbG90IG9mIGR1cGxpaWNhdGUgY29kZS4uICAKICAKbmFuby0wLjkuNSAtIDA1LzAxLzIwMDAKLSBSZW1vdmVkIGJ5dGVzIGZyb20gZmlsZSBzdHJ1Y3QgYmVjYXVzZSBpdCB3YXMgY29tcHV0YXRpb25hbGx5IHdhc3RlZnVsLgotIGN1dC5jOgogIGRvX3VuY3V0X3RleHQoKToKCS0gQWRkZWQgY2FsbCB0byBlZGl0X3JlZnJlc2goKS4KLSBuYW5vLmM6CiAgZG9fYmFja3NwYWNlKCk6CgktIEFkZGVkIHJlc2V0IG9mIGVkaXRib3Qgd2hlbiBkZWxldGluZyB0aGUgbGFzdCBsaW5lIG9mIHRoZSBmaWxlCgkgIChidWcgZGlzY292ZXJlZCBieSBBZGFtKS4KICBkb19jaGFyKCk6CgktIFJlbW92ZWQgY2FsbCB0byByZXNldF9jdXJzb3IoKS4KICBkb19kZWxldGUoKToKCS0gQWRkZWQgc2ltaWxhciBjaGVjayBhcyB0byBkb19iYWNrc3BhY2UoKS4KICBkb19lbnRlcigpOgoJLSBBZGRlZCBjYWxsIHRvIGVkaXRfcmVmcmVzaCgpLgogIGRvX2xlZnQoKSwgcmlnaHQoKToKCS0gQWRkZWQgY2FsbCB0byB1cGRhdGVfbGluZSgpLCBzdGlsbCByZWR1bmRhbnQgYnV0IGJldHRlci4uLgogIGRvX3VwKCksIGRvX2Rvd24oKToKCS0gQWRkZWQgcmVmcmVzaCBjYWxscyBib3RoIGZvciBjdXJyZW50IGxpbmUgYW5kIGxpbmUgdG8gd2hpY2gKCSAgd2UgYXJlIG1vdmluZy4KICBtYWluKCk6CgktIFJlbW92ZWQgaW5lZmZpY2llbnQgY2FsbCB0byBlZGl0X3JlZnJlc2goKSBhZnRlciBldmVyeSBrZXlzdHJva2UuCgkgIEl0IGlzIG5vdyB1cCBlYWNoIGZ1bmN0aW9uIHRvIGxlYXZlIHRoZSBzY3JlZW4gaW4gYSBnb29kIHN0YXRlLgotIHdpbmlvLmM6CiAgZG9fY3Vyc29ycG9zKCkKCS0gUmV3cml0dGVuIHRvIG5vdCB1c2UgYnl0ZXMgZnJvbSBmaWxlc3RydWN0IGJ5IGFuIGluY3JlbWVudGFsIHN1bS4KICB1cGRhdGVfbGluZSgpLCByZXNldF9jdXJzb3IoKToKCS0gT3B0aW1pemVkIGNhbGxzIHRvIHhwbHVzdGFicygpIHRocm91Z2ggYSBzaW5nbGUgdmFyaWFibGUuCgktIHVwZGF0ZV9saW5lKCkgbm93IHRha2VzIGEgbmV3IGFyZywgYW4gaW5kZXggaW50byB0aGUgc3RyaW5nCgkgIGZvciB3aGVyZSB0byB1cGRhdGUgdGhlIGxpbmUgZnJvbS4gIE5lZWRlZCBmb3IgbmV3IHVwZGF0ZQoJICBjb2RlLgotIGNvbmZpZ3VyZS5pbjoKCS0gQmV0dGVyIGNoZWNrcyBmb3Igc2xhbmcsIGFsbG93cyBhcmd1bWVudCB0byAtLXdpdGgtc2xhbmcuCgkgIChBbGJlcnQgQ2hpbi1BLVlvdW5nKQoJLSBSZW1vdmVkIC1JaW50bCBmcm9tIENGTEFHUyBpbiBnY2MgY2hlY2suCi0gTWFrZWZpbGUuYW06CgktIEFkZGl0aW9uIG9mIC1JaW50bCBmb3IgZ2V0dGV4dCAoQWxiZXJ0IENoaW4tQS1Zb3VuZykKCm5hbm8tMC45LjQgLSAwNC8yNS8yMDAwCiAtIEZpeGVkIGNhbGxzIHRvIG5vX2hlbHAgYW5kIGNoYW5nZWQgdGhlbSB0byB0aGUgbW9yZSBjb25zaXN0ZW50CiAgIElTU0VUKE5PX0hFTFApLiAgRml4ZWQgcmV0dXJuIHZhbCBvZiBub19oZWxwIHRvIGJlIHdoYXQgaXQgc2hvdWxkICgyLAogICBub3QgMS4gIENvZGUgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSBOT19IRUxQIHdoZW4gaW4gdGhlCiAgIGhlbHAgc3lzdGVtLiAoQWRhbSBSb2dveXNraSkKLSBjdXQuYzoKICBkb19tYXJrZWRfY3V0KCksIGRvX2N1dCgpLCBkb191bmN1dCgpOgoJLSBDb21tZW50ZWQgb3V0IHVubmVjZXNzYXJ5IGJpdHMgd2hlbiBOQU5PX1NNQUxMIGlzIGJlaW5nIHVzZWQuCi0gd2luaW8uYzoKICB4cHQoKSwgc3RybGVucHQoKSwgYWN0dWFsX3goKToKCS0gQWRkZWQgY2hlY2sgZm9yIHZhbHVlIG9mIGRhdGFbaV0gJiAweDgwLCBpZiBzbyBkbyBub3QgbWFrZQoJICBjaGFyYWN0ZXIgMiBjaGFycyB3aWRlIChvcmlnLiBieSBDaHJpcywgMHg4MCBjaGVjayBieSBBZGFtKS4KICBlZGl0X3JlZnJlc2goKToKCS0gTmV3IGNoZWNrIGZvciB0ZW1wID09IE5VTEwgKGJhZCB0aGluZyksIGlmIHNvIGdvIGJhY2sgdG8gdGhlCgkgIHByZXZpb3VzIGxpbmUuICBOZXcgZmlsZXN0cnVjdCB2YXIgaG9sZCBwb2ludHMgdG8gcHJldiBsaW5lLgoJICBGaXhlcyBzZWdmYXVsdCB3aGVuIHBhZ2luZyBkb3duIHRvIHRoZSBlbmQgb2YgYSBmaWxlLgotIG5hbm8uYzoKICB3cml0ZV9maWxlKCk6CgktIEFkZGVkIGNoZWNrIGZvciBpZiBmaWxlIGV4aXN0cyBhbmQgaXMgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50CgkgIGZpbGVuYW1lLCBwcm9tcHQgZm9yIG92ZXJ3cml0ZSAoQWRhbSBSb2dveXNraSkuCiAgZG9fZG93bigpOgoJLSBSZW1vdmVkIGNoZWNrIGZvciBjdXJyZW50LT5uZXh0ID09IE5VTEwsIG5vdyBjaGVja3MgcmV0dXJuIHZhbHVlCgkgIG9mIGRvX2Rvd24gYmVmb3JlIHNldHRpbmcgY3VycmVudF94ID0gMCAoZGlzY292ZXJlZCBieSBBZGFtKS4KICBkb19qdXN0aWZ5KCk6CgktIEZpeGVkIHNlZ2ZhdWx0IHdoZW4gcmVhY2hpbmcgdGhlIGxhc3QgbGluZSAodHJpZWQgdG8gYXNzaWduCgkgIGN1cnJyZW50LT5uZXh0LT5kYXRhIHdoZW4gY3VycmVudC0+bmV4dCA9PSBOVUxMKSAoZGlzY292ZXJlZAoJICBieSBBZGFtKS4KLSB1dGlscy5jOgoJLSBSZW1vdmVkIGV4dHJhIG1hY3JvIGRlZnMgdGhhdCBhcmUgbm93IGluIG5hbm8uaC4KLSBuYW5vLmg6CgktIENoYW5nZWQgbWFjcm8gU0VUKCkgdG8gdXNlIHw9IGluc3RlYWQgb2YgXj0uICBGaXhlcyBidWcgaW4KCSAgY3V0IGNvZGUgd2hlbiBjdXR0aW5nIG1vcmUgdGhhbiBvbmUgbGluZSwgYW5kIGN1dGJ1ZmZlciBnZXRzCgkgIGJsb3duIGF3YXkgd2hlbiBpdCBzaG91bGRudC4gIAoKbmFuby0wLjkuMyAtIDA0LzI5LzIwMDAKLSBjdXQuYzoKICBkb19tYXJrZWRfY3V0KCk6CgktIEZpeGVkIG9mZiBieSBvbmUgZXJyb3IgaW4gY3V0IGNvZGUgZm9yIG1hcmtlZCB0ZXh0LgogIGRvX2N1dF90ZXh0KCk6CgktIFJlbW92ZWQgY2hlY2sgZm9yIGJlaW5nIG9uIHRoZSBsYXN0IGxpbmUsIHBhcnQgb2YKCSAgbWFnaWMgbGluZSBjb2RlLgogIGFkZF90b19jdXRidWZmZXIoKToKCS0gTW92ZWQgdG1wLT5wcmV2ID0gaW5wdHIgbGluZSB0byBwYXJ0IHdoZXJlIGN1dGJ1ZmZlciAhPSBOVUxMLgoJLSBBZGRlZCBpbnB0ci0+cHJldiA9IE5VTEwgZm9yIGNhc2Ugd2hlcmUgY3V0YnVmZmVyID09IE5VTEwuCi0gbmFuby5jOgogIGRvX2JhY2tzcGFjZSgpLCBkb19jaGFyKCk6ICAKCS0gUmVtb3ZlZCAibWFnaWMgbGluZSIgY29kZS4gIEl0IHdhcyBiYXNpY2FsbHkgY2F1c2luZyBtb3JlIGJ1Z3MKCSAgdGhhbiBpdCB3YXMgaGVscGluZyBmb3IgdGhlIHNha2Ugb2YgY29tcGF0aWJpbGxpdHkuICBUaGlzIGZpeGVzCgkgIGF0IGxlYXN0IG9uZSBrbm93biBzZWdmYXVsdCBjb25kaXRpb24uCiAgZG9fZW50ZXIoKToKCS0gQWRkZWQgc2V0dGluZyBlZGl0Ym90IHRvIG5ldyBub2RlIGlmIHRoZSBuZXcgbm9kZSBpcyB0aGUgbGFzdAoJICBub2RlIGluIHRoZSBmaWxlLgogIHdyaXRlX2ZpbGUoKToKCS0gQ2hhbmdlZCB3cml0aW5nIGZpbGUgYmFoYXZpb3IuICBOb3csIGlmIGxhc3QgbGluZSBvZiB0aGUgZmlsZQoJICBoYXMgYW55IGRhdGEgb24gaXQsIHdlIHdyaXRlIGEgbmV3bGluZSBvbiBpdCwgZWxzZSB3ZSBkb250LgotIHdpbmlvLmM6CiAgYWRkX21hcmtlZF9zYW1lbGluZSgpOgoJLSBOZXcgY29kZSB0aGF0IGNoZWNrcyBmb3Igd2hldGhlciB0aGUgYmVnaW4gYW5kIGVuZCBvZiB0aGUgbWFya2VyCgkgIGFyZSBvbiBkaWZmZXJlbnQgbGluZXMuICBNaXNzaW5nIHByZXZpb3VzbHkuCiAgZWRpdF9hZGQoKToKCS0gYWRkZWQgc29tZSBtb3JlIGNoZWNrcyBmb3IgdGV4dCBsZW5ndGguICBDbGVhbmVkIHVwIHNvbWUgbXZ3YWRkbnN0cnMgdGhhdAoJICBjb3VsZCBiZSB3cml0dGVuIG1vcmUgc2ltcGx5IGFzIHdhZGRuc3Rycy4KICBlZGl0X3JlZnJlc2goKToKCS0gUmVtb3ZlZCBjaGVjayBmb3IgdGVtcCA9PSBmaWxlYm90LCBpdCBpcyBub3cgdHJlYXRlZCBsaWtlIGFueSBvdGhlciBsaW5lLgoJICBGaXhlcyBhIGJ1ZyB3aGVyZSBzZWxlY3RlZCB0ZXh0IG9uIHRoZSBsYXN0IGxpbmUgc2hvd3Mgbm9ybWFsbHkuCiAgeHB0KCk6CgktIFJlbW92ZWQgYW4gZXh0cmEgY29tcHV0YXRpb24gZm9yIHRhYnMgdmFyaWFibGUgdGhhdCB3YXMgaW5jb3JyZWN0LgogIHhwbHVzdGFicygpOgoJLSBTaW5jZSB4cHQgbm93IGFjdHVhbHkgd29ya3MsIHRoaXMgZnVuYyBpcyBub3cganVzdCBhIHdyYXBwZXIgZm9yCgkgIHhwdChjdXJyZW50LCBjdXJyZW50X3gpCi0gbmFuby4xLCBuYW5vLjEuaHRtbDoKCS0gQWRkZWQgLWwgb3B0aW9uIHRvIG1hbiBwYWdlcy4KLSBjb25maWd1cmUuaW46CgktIE5ldyBvcHRpb24gLS1lbmFibGUtdGlueSwgI2RlZmluZXMgTkFOT19TTUFMTCBpbiBjb25maWcuaC4gIAoJICBEaXNhYmxlcyBjYWxsIHRvIGdldHRleHQgaW4gZnVuY3Rpb25zIGFuZCBvdGhlciBpMThuIHN0dWZmIGluIAoJICBuYW5vLmMsIHRoZSBkZXRhaWxlZCBoZWxwIG1vZGUsIHRoZSByZXNpemUgZnVuY3Rpb25zLCBhbmQgdGhlIAoJICBqdXN0aWZ5IGNvZGUgd2hpY2ggbm8gb25lIGV2ZXIgdXNlcy4KCS0gTmV3IG9wdGlvbiAtLXdpdGgtc2xhbmcuICBFbmFibGVzIHNsYW5nIGxpYnJhcmllcyBpbnN0ZWFkIG9mCgkgIG5jdXJzZXMsIHJlcXVpcmVzIHNsY3Vyc2VzLmggZm9yIHdyYXBwZXIgZnVuY3Rpb25zLiAoQmFzZWQKCSAgb24gcGF0Y2hlcyBmb3IgMC44LjcgYnkgR2xlbm4gTWNHcmF0aCkuCgpuYW5vLTAuOS4yIC0gMDQvMTUvMjAwMAotIFRoaXMgcmVsZWFzZSBqdXN0IGZpeGVzIHRoZSBzZXJpb3VzIHNlZ2ZhdWx0IHByb2JsZW0gaWYgbmFubyBpcyAKICBpbnZva2VkIGFueSB3YXkgb3RoZXIgdGhhbiB1c2luZyB0aGUgYWJzb2x1dGUgcGF0aC4gIFRoZSBidWcgd2FzCiAgaW4gdGhlIG5ldyBjb2RlIGZvciBjaGVja2luZyB3aGV0aGVyIG5hbm8gaXMgaW52b2tlZCBhcyBwaWNvLgoKbmFuby0wLjkuMSAtIDA0LzE0LzIwMDAKLSBBZGRlZCBwaWNvIGNvbXBhdGliaWxpdHkgZm9yIF5UIHdoZW4gaW4gc2VhcmNoIG9yIHN3aXRjaCB0byBzd2l0Y2gKICB0byB0aGUgb3Bwb3NpdGUgZnVuY3Rpb24uICBBZGRlZCBvbmUgdG8gUkVQTEFDRV9MSVNUX0xFTiBhbmQgCiAgV0hFUkVJU19MSVNUX0xFTiBpbiBuYW5vLmgsIG5ldyBhcmdzIHRvIHNjX2luaXRfb25lIGluIGdsb2JhbC5jIGFuZAogIG5ldyBzdHJpbmdzIHRoYXQgd2lsbCBoYXZlIHRvIGJlIGdldHRleCgpZWQuICBOZXcgYXJndW1lbnQgJ3JlcGxhY2luZycKICB0byBzZWFyY2hfaW5pdCgpLiAgSGFuZGxlcnMgaW4gZG9fcmVwbGFjZSBhbmQgZG9fc2VhcmNoKCkuCi0gTmV3IHdyaXRlIGNvZGUsIG5vdyBmb2xsb3dzIHN5bWJvbGljIGxpbmtzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZW0KICB3aXRoIHRoZSBuZXcgZmlsZS4gIE5ldyBvcHRpb24gKC1sLCAtLW5vZm9sbG93KSB0byBlbmFibGUgdGhlIG9sZAogIChpbmNvcnJlY3QsIGJ1dCBzZWN1cmUpIGJlaGF2aW9yIChBZGFtIFJvZ295c2tpKS4KLSBuYW5vLmM6CiAgZG9fd3JhcCgpOgkKCS0gRml4ZWQgYW5vdGhlciBidWcgcmVsYXRpbmcgdG8gd3JhcHBpbmcsIGFuZCB3aGljaCB3b3VsZCBjYXVzZQoJICBhIHNlZ2ZhdWx0ICpzaWdoKi4KICBkb19yZXBsYWNlKCk6IAoJLSBJbmNyZW1lbnRlZCBjdXJyZW50X3ggYnkgdGhlIGxlbmd0aCBvZiB0aGUgcmVwbGFjZW1lbnQKCSAgdGV4dCBpbnNpZGUgdGhlIG1haW4gcmVwYWxjZSBsb29wLiAgRml4ZXMgYnVnICMxNS4KICBhZGRfbWFya2VkX3NhbWVsaW5lKCk6CgktIE5ldyBmdW5jdGlvbiwgaGFuZGxlcyBtYXJrZWQgdGV4dCB3aGVuIHN0YXJ0ICYgZW5kIG9mIG1hcmtlciBpcwoJICBvbiBvbmUgbGluZSwgYWxzbyBzdXBwb3J0cyBtb3N0IG1hcmtlZCB0ZXh0IHdoZW4gY3Vyc29yID4gQ09MUy4KICBtYWluKCk6CgktIENvZGUgdG8gY2hlY2sgaWYgbmFubyBpcyBpbnZva2VkIGFzICdwaWNvJywgYW5kIGlmIHNvCgkgIGF1dG9tYXRpY2FsbHkgc2V0IHBpY29fbXNncyAoUm9iZXJ0IEpvbmVzKS4KCm5hbm8tMC45LjAgLSAwNC8wNy8yMDAwCi0gbmFuby4xLCBuYW5vLjEuaHRtbDogCVVwZGF0ZWQgbWFuIHBhZ2Ugd2l0aCBteSBlbWFpbCBhZGRyZXNzIGFuZCBob21lcGFnZS4KLSB3aW5pby5jOgogIHJlc2V0X2N1cnNvcigpLCB1cGRhdGVfbGluZSgpOgkKCS0gQ2hhbmdlZCB1cGRhdGUgYWxnb3JpdGhtIGZvciB4IHZhbHVlIHRvIChDT0xTIC0gNykgbXVsdGlwbGUgd2hlbiB4CgkgIHZhbHVlID4gKENPTFMgLSAyKS4KLSBlZGl0X3JlZnJlc2goKToKCS0gUmVtb3ZlZCBpbm5lciBsb29wIGNvZGUsIG5vdyBjYWxscyB1cGRhdGVfbGluZSgpIGZvciBlYWNoIGxpbmUKCSAgaW4gcXVlc3Rpb24sIE1VQ0ggbmljZXIuCi0geHBsdXN0YWJzKCksIHhwdCgpOgoJLSBSZW1vdmVkIHJlZHVuZGFudCBpbmNyZW1lbnQgb2YgdGFicyB3aGVuIGNvbGx1bW4gbm8gJSA4ID09IDAuCgktIEFkZGVkIGNoZWNrIGZvciBkYXRhW2ldIDwgMzIsIG1vc3Qgb2Ygc3VjaCBiaXRzIGFyZSAyIGNoYXJzIHdpZGUuCi0gdXBkYXRlX2xpbmUoKToKCS0gRml4ZWQgYSBzdHVwaWQgY2FsbCB0byBzdHJsZW5wdCB3aXRoIGNvbCB3aGVuIHdlIHNob3VsZCBoYXZlCgkgIGJlZW4gdXNpbmcgYWN0dWFsX2NvbC4gIFVnaC4KCm5hbm8tMC44LjkgLSAwMy8yMi8yMDAwCi0gbmFuby5jOgogIGVtcHR5X2xpbmUoKSwgbm9fc3BhY2VzKCksIGp1c3RpZnlfZm9ybWF0KCksIGRvX2p1c3RpZnkoKToKCQlBY3R1YWxseSBhZGRlZCB0aGVzZSAoc2NyZXd1cCBhcHBseWluZyBwYXRjaCkuCiAgZG9fanVzdGlmeSgpOglBZGRlZCBjYWxsIHRvIHNldF9tb2RpZmllZCgpLgoKbmFuby0wLjguOCAtIDAzLzEyLzIwMDAKLSBQcmVsaW1pbmFyeSBpbnRlcm5hdGlvbmFsaXphdGlvbiBzdXBwb3J0LiAgTWFueSBtYW55IGZ1bmN0aW9ucyBtb2RpZmllZAogIHRvIHVzZSBnZXR0ZXh0ICh2aWEgXygpIG1hY3JvKS4gIGVzLnBvIGZpbGUgaW5jbHVkZWQuIChKb3JkaSBNYWxsYWNoKQogIE5ldyBkaXJzIHBvLyBhbmQgaW50bC8sIGNoYW5nZXMgdG8gY29uZmlndXJlLmluIGFuZCBBdXRvbWFrZS5hbSB0bwogIHN1cHBvcnQgaTE4bi4KLSBuYW5vLmM6CiAgaW5jbHVkZXM6CURkZGVkIHN5cy9wYXJhbS5oIGFuZCBsaW1pdHMuaC4gKEFkYW0gUm9nb3lza2kpLgogIHN0YXRpY3M6IAlDaGFuZ2VkIHNvbWUgdGhpbmdzIHRoYXQgd2VyZSBub3QgbmVjZXNzYXJpbHkgc3RhdGljIAoJCShBZGFtIFJvZ295c2tpKS4KICBucmVhbGxvYygpOglOZXcgZnVuY3Rpb24sIHNpbWlsYXIgdG8gbm1hbGxvYygpLiAgQ2hhbmdlZCBjYWxscyBmcm9tCgkJcmVhbGxvYygpIHRvIG5yZWFsbG9jIChBZGFtIFJvZ295c2tpKS4KICBlbXB0eV9saW5lKCksIG5vX3NwYWNlcygpLCBqdXN0aWZ5X2Zvcm1hdCgpLCBkb19qdXN0aWZ5KCk6CgkJTmV3IGZ1bmN0aW9ucyBmb3IganVzdGlmeSBmdW5jdGlvbiAoQWRhbSBSb2dveXNraSkuCi0gd2luaW8uYzoKICBibGFua19lZGl0KCk6CUFkZGVkIHdyZWZyZXNoIGNhbGwgdG8gZWRpdCBzbyB0aGF0IHNjcmVlbiB1cGRhdGVzIChsaWtlCgkJb24gXkwpIGFjdHVhbGx5IHdvcmsuCiAgeHBsdXN0YWJzKCksIHhwdCgpLCBzdHJsZW5wdCgpOiBGaXhlZCBvZmYtYnktb25lIGJ1Z2xldHMgKEFkYW0gUm9nb3lza2kpLgoKbmFuby0wLjguNyAtIDAzLzAxLzIwMDAKLSBtYWluLmM6CiAgZG9fd3JhcCgpOglCZXR0ZXIgZml4IGZvciBzZWdmYXVsdHMsIGFuZCBmaXggZm9yIGxpc25lcyBiZWluZyB3cmFwcGVkIAoJCXRvIGEgc2luZ2xlIGNoYXJhY3RlciBvbiBvbmUgbGluZSB3aGVuIG5vIGdvb2QgcGxhY2UgdG8gCgkJYnJlYWsgdGhlIGxpbmUgZXhpc3RzLCBhbmQgZm9yIHdyYXBwaW5nIGxpbmVzIGxvbmdlciB0aGFuIENPTFMuCi0gbmFuby4xLmh0bWw6CgkJSHRtbCB2ZXJzaW9uIG9mIG1hbiBwYWdlLCBub3cgaW5jbHVkZWQgaW4gZGlzdC4gIEZvcgoJCXRoZSBiZW5lZml0IG9mIG5hbm8gcGFja2FnZXMgaW4gTGludXggZGlzdHJpYnV0aW9ucy4KCm5hbm8tMC44LjYgLSAwMi8yNC8yMDAwCi0gZ29iYWwuYzoKICBzaG9ydGN1dF9pbml0KCk6CgkJQWRkZWQgc2hvcnRjdXRzIGZvciBnb3RvX2xpbmUgYW5kIGRvX3JlcGxhY2Ugd2hlbiB1c2luZwoJCXBpY29fbXNncy4gIE9vcHMuCi0gbmFuby5jOgogIHN0YXRpY3M6CUNoYW5nZWQgZmlsbCBiYWNrIHRvIDAgZnJvbSA3MSBieSBkZWZhdWx0IChBZGFtIFJvZ295c2tpKS4KICBkb193cmFwKCk6CUFkZGVkIGNoZWNrIGZvciBiYWNraW5nIHVwIHBhc3QgdGFicywgd2hpY2ggd2Ugc2hvdWxkbnQgZG8uCgkJUmVtb3ZlZCBjaGVjayBmb3IgYmFja2luZyB1cCBwYXN0IHNwYWNlcyBmaXJzdC4KICBtYWluKCk6CUFkZGVkIGZvciBsb29wIHRvIGNoZWNrIGZvciBhbHQga2V5cyBpbnN0ZWFkIG9mIGhhcmQgbGlzdC4KICBkb19lbnRlcigpOglGaXggZm9yIGJ1ZyAjMTQsIGFkZGVkIGNhbGwgdG8gcmVzZXRfY3Vyc29yIGFuZCBtZXNzZWQKCQl1cCBkb19jaGFyIHF1aXRlIGEgYml0LgogIHZlcnNpb24oKToJQWRkZWQgdGltZSBhbmQgZGF0ZSBzdGFtcCBmb3IgY29tcGlsZSBvbiB2ZXJzaW9uIG1lc3NhZ2UuCgkJQWRkZWQgbWFpbCBhbmQgd2ViIHBhZ2UgaW5mby4KLSBSRUFETUU6CVVwZGF0ZWQgbWFpbGluZyBsaXN0IGluZm8uCgpuYW5vLTAuOC41IC0gMDIvMTgvMjAwMAotIG5hbm8uYzoKICBtYWluKCk6CUZpbmFsbHkgZml4ZWQgdGlsZGUgYmVpbmcgaW5wdXQgb24gcGFnZSB1cC9kb3duIGtleXMgaW4KCQljZXJ0YWluIHRlcm1pbmFsIHR5cGVzLiAgRml4IHdhcyBpbnB1dCAyNi0+OTEtPjVbMzRdIGNoZWNrCgkJZm9yIDEyNiwgaWYgc28gbWFrZSB0aGUga2JpbnB1dCBQQUdFIFVQL0RPV04sIGVsc2UgdW5nZXQKCQl0aGUga2V5c3Ryb2tlIGFuZCBjb250aW51ZS4gIEFkZGVkICNpbmNsdWRlIDxpb2N0bC5oPiBmb3IKCQlpb2N0bCBjYWxsLgogIGhhbmRsZV9odXAoKToKCQlIYW5kbGVyIGZvciBoYW5ndXAgc2lnbmFsLiAgQmVsYXRlZCBpbmNsdWRlIG9mIHBhdGNoIGZyb20KCQlUaW0gU2hlcndvb2QuCi0gd2luaW8uYzoKICBlZGl0X3JlZnJlc2goKToKCQlUZW1wb3JhcnkgZml4IGZvciBzZWxlY3RpbmcgdGV4dCB3aGVuIHRlbXAgPT0gY3VycmVudC4KCQllZGl0X3JlZnJlc2goKSBpcyBub3cgdW5tYW5hZ2FibHkgY29tcGxleCwgYW5kIG11c3QgYmUKCQlyZXZhbXBlZC4KICBjaGVja19zdGF0YmxhbmsoKToKCQlBZGRlZCBjaGVjayBmb3IgY29uc3R1cGRhdGUsIG1ha2VzIHRoaW5ncyBsZXNzIGNob3BweQoJCShBZGFtIFJvZ295c2tpKQoKbmFuby0wLjguNCAtIDAyLzExLzIwMDAKLSBNb3ZlZCBnbG9iYWwgdmFyaWFibGVzIHRoYXQgd2VyZSBvbmx5IChvciBtb3N0bHkpIHVzZWQgaW4gb25lIGZpbGUgaW50bwogIGl0cyBwcm9wZXIgZmlsZSBhcyBhIHN0YXRpYy4gIEFmZmVjdHMgY3V0LmMsIG5hbm8uYywgZ2xvYmFsLmMgKEFuZHkgS2FobikuCi0gZ2xvYmFsLmM6CQogIHNob3J0Y3V0X2luaXQoKToKCQlSZW1vdmVkIHJlZHVuZGFudCBOQU5PX0NPTlRST0xfSCBmcm9tIGJhY2tzcGFjZSBzaG9ydGN1dCwKCQlhZGRlZCBjaGFyIDEyNyB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHRoZXJlLgotIG5hbm8uYzoKICBtYWluKCk6CUZpeCBmb3IgbG9vcHMgbG9vcGluZyB1bnRpbCBNQUlOX0xFTiwgYWRkZWQgLTEgdG8gc3RvcAoJCXNlZ2ZhdWx0cyAoQWRhbSBSb2dveXNraSkuCi0gTWFrZWZpbGUuYW06CUFkZGVkIGFsbCBzb3VyY2UgZmlsZW5hbWVzIChBZGFtIFJvZ295c2tpKS4KLSBuYW5vLjE6CUZpeGVkIG1haWwgYWRkcmVzc2VkIGFuZCBhZGRlZCBtYWlsaW5nIGxpc3QgYWRkcmVzcy4KLSBSRUFETUU6CVVwZGF0ZWQgbXkgZW1haWwgYWRkcmVzcyBhbmQgdGhlIG5hbm8gd2ViIHBhZ2UuCgpuYW5vLTAuOC4zIC0gMDIvMDgvMjAwMAotIE5ldyBwaWNvIG1vZGUgKC1wLCAtLXBpY28pLCB0b2dnbGVzIChtb3JlKSBjb21wYXRpYmlsaXR5IHdpdGggdGhlCiAgUGljbyBtZXNzYWdlcyBkaXNwbGF5ZWQgaW4gdGhlIHNob3J0Y3V0IGxpc3QuICBOb3RlIHRoYXQgdGhlcmUgYXJlIHN0aWxsCiAgc21hbGwgZGlmZmVyZW5jZXMgaW4gdGhpcyBtb2RlLgotIG5hbm8uaDoJTmV3IHNob3J0Y3V0IHN0cnVjdCBmb3JtYXQsIGZvciB0aGUgYmVuZWZpdCBvZiBpMThuIGFuZAoJCW91ciBoZWxwIG1lbnUuICBSZW1vdmVkIHNob3J0Y3V0IG1lc3NhZ2UgbWFjcm9zLCB0aGV5IGFyZQoJCW5vdyBhbGwgaW4gc2hvcnRjdXRfaW5pdCBpbiBnbG9iYWwuYy4KLSBuYW5vLmM6CiAgZG9fd3JhcCgpOglSZW1vdmVkIHJlc2V0dGluZyBvZiBjdXJyZW50X3ggd2hlbiB3ZSBhcmUgaW4gZmFjdAoJCXdyYXBwaW5nIHRvIHRoZSBuZXh0IGxpbmUsIGZpeGVzIGEgYnVnIGluIC1pIG1vZGUuCiAgZG9fZW50ZXIoKToKCQlSZXdyb3RlIHRoZSBhdXRvaW5kZW50IG1vZGUgY29kZSB0byBiZSBhIGxvdCBsZXNzIHByZXR0eSwKCQlidXQgYSBsb3QgbW9yZSBtYWdpY2FsLgogIG1haW4oKToKCQlSZW1vdmVkIGNhc2UgZm9yIGlnbm9yaW5nIGNoYXIgMTI2ICh+KS4gIFRoYXQncyBraW5kIG9mCgkJaW1wb3J0YW50LCB3ZSdsbCBoYXZlIHRvIGZpeCBoYW5kbGluZyB0aGF0IHNlcXVlbmNlIHdoZW4KCQlwYWdlaW5nIHVwL2Rvd24gb24gYSB0ZXJtaW5hbCBzb21lIG90aGVyIHdheS4uLiBSZXZhbXBlZAoJCW1haW4gc3dpdGNoIGxvb3AgaW4gbXVjaCBzbmF6emllciBmYXNoaW9uIGJhc2VkIG9uIHRoZQoJCXNob3J0Y3V0IGxpc3QuCi0gd2luaW8uYzoKCQlOZXcgZnVuY3Rpb24gZGlzcGxheV9tYWluX2xpc3QuICBBZmZlY3RzIGFsbCBmdW5jdGlvbnMKCQl0aGF0IHVzZWQgdG8gY2FsbCBib3R0b21iYXJzKCkgd2l0aCBtYWluX2xpc3QuICBBZGRlZAoJCWJlY2F1c2Ugd2Ugbm93IG9ubHkgY2FsbCBib3R0b21iYXJzIHdpdGggdGhlIG1hY3JvCgkJTUFJTl9WSVNJQkxFIGluc3RlYWQgb2YgTUFJTl9MSVNUX0xFTiwgYmVjYXVzZSBvZiB0aGUKCQljaGFuZ2VzIHRvIHRoZSBtYWluX2xpc3Qgc2hvcnRjdXQgbGlzdCAoc2VlIGdsb2JhbC5jIGJlbG93KS4KCQlOZXcgZnVuY3Rpb24gZG9faGVscCwgb3VyIHByZWxpbWluYXJ5IGR5bmFtaWMgaGVscCBzeXN0ZW0uCi0gTWFueSBtYW55IGZ1bmNzOgoJCUNoYW5nZWQgZnJvbSBpbnQgdG8gdm9pZCB0byBhbGxvdyBvbmUgdW5pZm9ybSB0eXBlIHRvIGNhbGwKCQlmcm9tIHRoZSBzaG9ydGN1dCBzdHJ1Y3QuICBBbHNvIGEgZmV3IGZ1bmN0aW9ucyB0aGF0IGRvCgkJbm90IHNpbXBsZSBoYXZlIHZvaWQgYXJndW1lbnQgaGF2ZSBuZXcgZnVuY3Rpb25zIGNhbGxlZAoJCWZ1bmNuYW1lX3ZvaWQodm9pZCkgdG8gYmUgY2FsbGVkIGZyb20gdGhlIHNob3J0Y3V0IGxpc3QuCgkJZG9fY3V0X3RleHQgYW5kIGRvX3VuY3V0X3RleHQgd2VyZSBjaGFuZ2VkIHRvIHZvaWQKCQlhcmd1bWVudHMgYmVjYXVzZSB0aGV5IHdlcmUgbmV2ZXIgY2FsbGVkIHdpdGggYSBmaWxlc3RydWN0CgkJb3RoZXIgdGhhbiAqY3VycmVudCBhbnl3YXkuCi0gZ2xvYmFsLmM6CgkJU2hvcnRjdXQgbGlzdCBtYWluX2xpc3Qgd2FzIGV4cGFuZGVkIHRvIGNvdmVyIGFsbAoJCXNob3J0Y3V0cyB0aGF0IGNvdWxkIGJlIGNhdWdodCBpbiB0aGUgbWFpbiBsb29wLgoJCUNvbnNlcXVlbnRseSB0aGVyZSBpcyBhIG5ldyBtYWNybyBNQUlOX1ZJU0lCTEUgd2hpY2ggdGVsbHMKCQlob3cgbWFueSBpdGVtcyBpbiB0aGUgbWFpbiBsaXN0IHRvIGFjdHVhbGx5IHNob3cuCgpuYW5vLTAuOC4yIC0gMDIvMDIvMjAwMAotIEFkZGVkIGluaXRpYWwgbW91c2UgKC1tLCAtLW1vdXNlKSBzdXBwb3J0LiAgTmV3IGdsb2JhbCB2YXJpYWJsZQogIHVzZV9tb3VzZS4gKEFkYW0gUm9nb3lza2kpCgotIG5hbm8uYzoJU2V0IGludGlhbCB2YWx1ZSBvZiBmaWxsIHRvIENPTFMgLSA4IHJhdGhlciB0aGFuIGp1c3QgNzIKCQlyZWdhcmRsZXNzLiAoQWRhbSBSb2dveXNraSkuCiAgZG9fZGVsZXRlKCk6CQoJCURlbGV0ZWQgY2FsbCB0byBkb19iYWNrc3BhY2UoKSB3aGVuIG9uIHRoZSBlbmQgb2YgYSBsaW5lLAoJCWJlY2F1c2UgaXQgd29uJ3QgdXBkYXRlIHRoZSBsaW5lIHByb3Blcmx5LgogIGRvX2JhY2tzcGFjZSgpOgoJCVJlbW92ZWQgdW5uZWNlc3NhcnkgcG9pbnRlciBtYW5pcHVsYXRpb24gdGhhdCB3YXMgYmVpbmcKCQloYW5kbGVkIGJ5IHVubGlua19ub2RlKCkuCiAgb3Blbl9maWxlKCk6CgkJQWRkZWQgY2hlY2sgZm9yIHRyeWluZyB0byBvcGVuIGEgZGlyZWN0b3J5IChjdXJyZW50bHkgd2UKCQlzZWdmYXVsdCBvbiB0aGlzKS4gIEJ1ZyBwb2ludGVkIG91dCBieSBDaGFkIFppY2NhcmRpLgoKbmFuby0wLjguMSAtIDAxLzI4LzIwMDAKLSBJbXBsZW1lbnRlZCBQaWNvJ3MgLXIgKGZpbGwpIG1vZGUsIGNvbW1hbmQgbGluZSBmbGFnIC1yIG9yIC0tZmlsbC4gIE5ldwogIGdsb2JhbCB2YXJpYWJsZSBmaWxsLCBhZmZlY3RzIGNoZWNrX3dyYXAoKSwgZG9fd3JhcCgpLCBtYWluKCksIHVzYWdlKCksCiAgZ2xvYmFsLmMgYW5kIHByb3RvLmguCi0gbmFuby5jOgp3cml0ZV9maWxlKCk6CQlBZGRlZCAoaW5jcmVkaWJseSkgbmVjZXNzYXJ5IGNoZWNrIGZvciBFUEVSTSB3aGVuCgkJCWxpbmsoKSBmYWlscy4gIFRoaXMgYWxsb3dzIHVzIHRvIGFjdHVhbGx5IHNhdmUKCQkJZmlsZXMgdmlhIHJlbmFtZSgpIG9uIGZpbGVzeXN0ZW1zIHRoYXQgZG9udAoJCQlzdXBwb3J0IGhhcmQgbGlua3MgKEFJRUVFRUVFKS4KZG9fZ290bygpOgoJCQlGaXhlZCBhIHN0dXBpZCBtaXN0YWtlIHdoZXJlIHdlIHdlcmUgY2FsbGluZwoJCQlib3R0b21iYXJzKCkgd2l0aCByZXBsYWNlX2xpc3QgaW5zdGVhZCBvZiBnb3RvX2xpc3QuCi0gbmFuby5oOgoJCQlOZXcgY2hhciAqaGVscCBpbiBzaG9ydGN1dCBzdHJ1Y3R1cmUgZm9yIGhlbHAKCQkJZmVhdHVyZS4gQWRkZWQgTkFOT18qX01TRyBhbmQgTkFOT18qX0hFTFAgI2RlaWZuZXMKCQkJZm9yIGhlbHAgZnVuY3Rpb24gYW5kIGkxOG4uCi0gZ2xvYmFsLmM6CgkJCU5ldyBmdW5jdGlvbnMgc2hvcnRjdXRfaW5pdCAoY2FsbGVkIGluIG5hbm8uYykgYW5kCgkJCXNjX2luaXRfb25lKCkgdG8gaW5pdGlhbGl6ZSB0aGUgc2hvcnRjdXRzIHdpdGhvdXQKCQkJdXNpbmcge31zIChmb3IgaTE4bikuCgpuYW5vLTAuOC4wIC0gMDEvMjUvMjAwMAotIFZpZXcgZmxhZyAoLXYsIC0tdmlldykgaW1wbGVtZW50ZWQuICBHbG9iYWwgdmFyaWFibGUgdmlld19tb2RlLCBhZmZlY3RzCiAgbWFpbiBsb29wIG9mIG5hbm8uYyBhbmQgbmV3X2ZpbGUoKS4gKG1lKQotIG5hbm8uYzoKCQkJc3BsaXQgY2hlY2tzIGZvciBURVJNSU9TX0ggYW5kIFRFUk1JT19IIHVwIHNvIHdlCgkJCWNhbiAodGhlb3JldGljYWxseSkgaW5jbHVkZSB0aGVtIGJvdGgsIHdoaWNoIGlzIGdvb2QuCmhhbmRsZV9zaWd3aW5jaCgpOgoJCQlBZGRlZCBjaGVjayBmb3IgbmN1cnNlcy5oLiAgKEFuZHkgS2FobikKZG9fc3BlbGwoKToKCQkJV2Ugbm93IG9ubHkgdHJ5IGlzcGVsbCBiZWNhdXNlIHdlIGRvbid0IGFzIG9mIHlldAoJCQloYW5kbGUgdGhlICdzcGVsbCcgcHJvZ3JhbSB0aGUgcmlnaHQgd2F5LCBub3cgdGhhdAoJCQlJIGZpbmFsbHkga25vdyB3aGF0IHRoZSByaWdodCB3YXkgaXMgPS0pLiAgQWRkZWQKCQkJY2FsbCB0byBlZGl0X3VwZGF0ZShmaWxlYWdlKSB0byBzdG9wIHNlZ2ZhdWx0cy4KZ2xvYmFsX2luaXQoKToKCQkJQWRkZWQgaW5pdGlhbGl6YXRpb24gb2YgZWRpdCogZmlsZXN0cnVjdCBwb2ludGVycwoJCQl0byBzdG9wIHNlZ2ZhdWx0cyBvbiBzcGVsbCBjaGVjay4KdXNhZ2UoKToKCQkJQ2hlY2sgZm9yIGdldG9wdF9sb25nLCBhbmQgaWYgbm8gbGVhdmUgb3V0IHRoZQoJCQlHTlUgb3B0aW9ucyBldmVyeW9uZSBzZWVtcyB0byBsb3ZlIHNvIG11Y2ggKEFuZHkgS2FobikKbWFpbigpOgoJCQlBZGRlZCBjaGVja3MgZm9yIGdldG9wdF9sb25nIChBbmR5IEthaG4pCgkJCVdlIGlnbm9yZSBjaGFyYWN0ZXIgMTI2IGJlY2F1c2UgaXQgZ2V0cyBwdXQgaW50bwoJCQl0aGUgYnVmZmVyIHdoZW4gd2UgcGFnZSB1cC9kb3duIG9uIGEgdnQgdGVybWluYWwuCndyaXRlX2ZpbGUoKToKCQkJRml4ZXMgZm9yIHVtYXNrIChBZGFtIFJvZ295c2tpKS4gIFJlbmFtZWQgdG1wZmlsZQoJCQl2YXJpYWJsZSB0byB0bXAuICBEb2N1bWVudGVkIHRoZSB0bXAgb3B0dGlvbgoJCQliZXR0ZXIgaW4gdGhlIGZ1bmN0aW9uIGNvbW1lbnRzLiAgRml4ZWQgbXkgCgkJCXN0dXBpZGx5IGNvbW1lbnRlZCBvdXQgY2hlY2sgZm9yIHRtcCBvbiBzZXR0aW5nCgkJCXVtYXNrIHdoaWNoIEkgcmVhbGx5IGxpa2UgPT4KLSBuYW5vLmg6CgkJCU1hZGUgZGVzYyB2YXJpYWJsZSBpbiBzaG9ydGN1dCBzdHJ1Y3QgYSBwb2ludGVyCgkJCWluc3RlYWQgb2YgYSBmaXhlZC1sZW5ndGggc3RyaW5nLgotIHV0aWxzLmM6CgkJCUZpeGVkIGNoZWNrIGZvciBjb25maWcuaCBiZWZvcmUgbmFuby5oLgotIGNvbmZpZ3VyZS5pbjoKCQkJTmV3IGNoZWNrcyBmb3IgZ2V0b3B0X2xvbmcsIGdldG9wdC5oLCByZW1vdmVkCgkJCUNGTEFHUyBhbmQgTERGTEFHUyBjaGFuZ2VzLiAgR29ubmEgaGF2ZSB0byBydW4KCQkJc3RyaXAgbWFudWFsbHkgbm93ID0tKSAoQW5keSBLYWhuKQoJCQlBZGRlZCBjaGVjayBmb3IgSEFWRV9XUkVTSVpFLCBuZXcgZmlsZSBhY2NvbmZpZy5oIChtZSkuCgpuYW5vLTAuNy45IC0gMDEvMjQvMjAwMAotIE5ldyBhdXRvaW5kZW50IGZlYXR1cmUuICBDb21tYW5kIGZsYWcgJ2knIG9yICctLWF1dG9pbmRlbnQnLiAgTmV3CiAgZnVuY3Rpb24gZG9fY2hhcigpIHRvIGNsZWFuIHVwIGNoYXJhY3RlciBvdXRwdXQsIGdsb2JhbAogIHZhcmlhYmxlIGF1dG9pbmRlbnQgaW4gZ2xvYmFsLmMuIChHcmFoYW0gTWFpbndhcmluZykKLSBOZXcgZmxhZyAndCcgb3IgJy0tdGVtcGZpbGUnLCBsaWtlIFBpY28ncyAtdCBtb2RlLCBhdXRvbWF0aWNhbGx5IHNhdmVzCiAgZmlsZXMgb24gZXhpdCB3aXRob3V0IHByb21wdGluZy4gIEFmZmVjdHMgZG9fd3JpdGVvdXQoKS4gIEFsc28KICBkb193cml0ZW91dCgpIG5vdyB0YWtlcyBhIHBhcmFtZXRlciBmb3IgaWYgZXhpdGluZy4KICBHbG9iYWwgdmFyaWFibGUgdGVtcF9vcHQgaW4gZ2xvYmFsLmMgKEdyYWhhbSBNYWlud2FyaW5nKQotIFByZWxpbWluYXJ5IHNwZWxsIHByb2dyYW0gc3VwcG9ydC4gIEFkZGVkIGNvbW1hbmQgZmxhZyAnLXMnIG9yCiAgJy0tc3BlbGxlcicgZm9yIGFsdGVybmF0aXZlIHNwZWxsZXIgY29tbWFuZC4gIEFkZGVkIGZ1bmN0aW9uIGRvX3NwZWxsKCkKICBhbmQgZXhpdF9zcGVsbCgpIHRvIG5hbm8uYy4gIE5ldyBnbG9iYWwgdmFyaWFibGUgYWx0X3NwZWxsZXIuCi0gbmFuby5jOgogIG1haW4oKToJV2Ugbm93IGlnbm9yZSBpbnB1dCBvZiBkZWNpbWFsIDQxMCBiZWNhdXNlIHRoZXNlIGdldCBlbnRlcmVkIAoJCXdoZW4gd2UgcmVzaXplIHRoZSBzY3JlZW4uICBTb3J0ZWQgb3B0aW9ucyBpbiBnZXRvcHQoKQoJCXN3aXRjaCBzdGF0ZW1lbnQuCiAgdXNhZ2UoKToJU29ydGVkIG9wdGlvbnMgYW5kIGNoYW5nZWQgdGFicyB0byBtYWtlIHJvb20gZm9yIC1zIG9wdGlvbi4KICB3cml0ZV9maWxlKCk6CU5vdyB0YWtlcyBhIHNlY29uZCBwYXJhbWV0ZXIgJ3RtcGZpbGUnLCB1c2VzIG1hc2sgMDYwMCBhbmQKCQlkb2Vzbid0IHByaW50IHRoZSBudW1iZXIgb2YgbGluZXMgd3JpdHRlbiBvbiB0aGUgc3RhdHVzYmFyLgogIGdsb2JhbF9pbml0KCk6CgkJQWRkZWQgbW9yZSBpbml0aWFsaXphdGlvbnMgdG8gZ2xvYmFscyB0byBzdXBwb3J0IGRvX3NwZWxsKCkuCgpuYW5vLTAuNy44IC0gMDEvMjMvMjAwMAotIFN0dWJiZWQganVzdGlmeSBmdW5jdGlvbi4gIEFmZmVjdHMgbWFpbigpIGluIG5hbm8uYyBhbmQgbmFuby5oIGRlZmluZXMuCi0gQWRkZWQgRmtleSBlcXVpdmFsZW50cyBmb3IgUGljbyBjb21wYXRpYmlsdHkuICBBZmZlY3RzIG5hbm8uaCBkZWZpbmVzCiAgYW5kIG1haW4oKSBpbiBuYW5vLmMKLSBSZW1vdmVkIHJlZHVuZGFudCByZXNldF9jdXJzb3IoKSBjYWxscyBmcm9tIHRoZSBibGFuaygpIHJvdXRpbmVzLgotIG5hbm8uYzoKICBtYWluKCk6CUZpeGVkIHR5cG8gaW4gbWFpbiB3aGlsZSBsb29wIGZvciBOQU5PX0FMVF9SRVBMQUNFX0tFWS4KCQlSZW1vdmVkIGNoZWNrIGZvciBpc3ByaW50KCkgY2hhcmFjdGVycyBpbiBtYWluIHdoaWxlIGxvb3AKCQlmb3IgcGVvcGxlIHdpdGggb2RkIGNoYXJhY3RlciBzZXRzICpzaHJ1ZyouICBBZGRlZCBzb21lIFgKCQl3aW5kb3cgRi1rZXkgY29tYm9zLgogIHJlYWRfbGluZSgpOglOZXcgZnVuY3Rpb24sIGNvbnNvbGlkYXRlcyBvZiBtb3N0IG9mIHRoZSBzcGVjaWFsCgkJc2VjdGlvbnMgb2YgdGhlIGZpbGUgcmVhZGluZyBjb2RlLiAoUm9iIFNpZW1ib3Jza2kpCiAgZG9fcmVwbGFjZSgpOiBNYW55IHNjYXR0ZXJlZCBmaXhlcy4gKFJvYiBTaWVtYm9yc2tpKQogIHdyaXRlX2ZpbGUoKToJQWRkZWQgY2hlY2sgZm9yIGVtcHR5IGZpbGVuYW1lLgotIHdpbmlvLmM6CiAgbmFub2dldHN0cigpOglGaXhlcyBmb3IgZGVsZXRpbmcgYXQgcGxhY2VzIG90aGVyIHRoYW4gdGhlIGVuZCBvZiB0aGUKCQlidWZmZXIsIGN1dCBzdXBwb3J0LiAoQWRhbSBSb2dveXNraSkKICBibGFua19lZGl0KCk6CU5ldyBmdW5jdGlvbiwgYmxhbmtzIGVkaXQgYnVmZmVyLiAgQWRkZWQgY2FsbCB0byBpdCBpbiAKCQl0b3RhbF9yZWZyZXNoKCkuCi0gY29uZmlndXJlOglDaGVja3MgZm9yIGdsaWIgaWYgc25wcmludGYgb2YgdnNucHJpbnRmIGFyZW4ndCBhdmFpbGFibGUKCQkoQW5keSBLYWhuKS4gQ2hhbmdlZCB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBubyB0ZXJtY2FwIGxpYgoJCWlzIGZvdW5kLgoKbmFuby0wLjcuNyAtIDAxLzE5LzIwMDAKLSBPcHRpb24gJy12JyBmb3IgdmVyc2lvbiBtb3ZlZCB0byAnLVYnLCBiZWNhdXNlIC12IGlzIFBpY28ncyAicmVhZCBvbmx5IgogIG1vZGUgKGFmZmVjdHMgZ2V0b3B0KCkgaW4gbWFpbigpIGFuZCB1c2FnZSgpIGZ1bmN0aW9uIGluIG5hbm8uYwotIE5ldyBmbGFnIC1jLCBhbHdheXMgc2hvdyBjdXJzb3IgcG9zaXRpb24uICBBZmZlY3RzIG1haW4oKSBpbiBuYW5vLmMgYW5kCiAgc3RhdHVzYmFyKCkgaW4gd2luaW8uYwotIE9wdGlvbiAnLXgnIGRvZXNuJ3Qgc2hvdyBoZWxwIHdpbmRvdyBhdCB0aGUgYm90dG9tIG9mIHRoZSBlZGl0b3IuCiAgTmV3IHZhcmlhYmxlIG5vX2hlbHAgaW4gbmFuby5oIGFuZCBwcm90by5oLCBhZmZlY3RzIG1haW4oKSwgdXNhZ2UoKSwKICBhbmQgZ2xvYmFsX2luaXQoKSBpbiBuYW5vLmMsIGJsYW5rX2JvdHRvbWJhcnMoKSwgY2xlYXJfYm90dG9td2luKCksCiAgYm90dG9tYmFycygpLCBhbmQgZG9feWVzbm8oKSAgaW4gd2luaW8uYyAgKEkgaGFkIHRvIGFwcGx5IHRoaXMgcGF0Y2ggYnkKICBoYW5kID1QKSAoQWRhbSBSb2dveXNraSkKLSBuYW5vLmM6CiAgaGFuZGxlX3NpZ3dpbmNoKCk6CU5ldyBmdW5jdGlvbiAoQWRhbSBSb2dveXNraSksIGhhbmRsZXMgcmVzaXppbmcuCiAgcGFnZV91cCgpLCBwYWdlX2Rvd24oKToJCgktIE5ldyBmdW5jdGlvbnMuICBXZSBub3cgc2V0IHRoZSBjdXJzb3IgYXQgdGhlIHRvcCByaWdodCBjb3JuZXIsCgkgIG5vdCBhdCB0aGUgY2VudGVyIGxpbmUsIGFuZCBwYWdlIHVwIGFuZCBkb3duIGEgZnVsbCBzY3JlZW4KCSAgcmF0aGVyIHRoYW4gYSBoYWxmIHNjcmVlbi4gT3JpZ2luYWwgZnVuY3Rpb25zIHJlbmFtZWQgdG8KCSAgcGFnZV91cF9jZW50ZXIoKSBhbmQgcGFnZV9kb3duX2NlbnRlcigpLgogIG1haW4oKTogCgktIEFkZGVkIGNoZWNrIGZvciBrZXlzdHJva2Uga2V5IHNlcXVlbmNlIDQwNyBvciBOQU5PX0NPTlRST0xfWgoJICBpbiBtYWluIHdoaWxlIGxvb3AgYmVjYXVzZSBzdXNwZW5kIG1vZGUgd2FzIGJyb2tlbi4gIFRoaXMgc2hvdWxkCgkgIGZpeCBpdCwgYXQgbGVhc3QgZm9yIG5vdy4KCS0gQWRkZWQgbG9uZyBvcHRpb24gc3VwcG9ydCAoQnkgcG9wdWxhciBoYXJhc3NtZW50IDstKSAtIEFkZGVkCgkgICNpbmNsdWRlIGZvciBnZXRvcHQuaCwgY2hhbmdlZCBnZXRvcHQoKSB0byBnZXRvcHRfbG9uZygpLgoJICBPcHRpb25zIGFkZGVkIHNvIGZhcjogLS12ZXJzaW9uICgtViksIC0tbm93cmFwICgtdyksIC0tc3VzcGVuZAoJICAoLXopLCAtLWhlbHAgKC1oKSwgLS1ub2hlbHAgKC14KS4KCS0gUmV3cm90ZSBzaWduYWwgc3RhdGVtZW50cyAoQWRhbSBSb2dveXNraSkKCm5hbm8gMC43LjYgLSAwMS8xNS8yMDAwCi0gTmV3IENoYW5nZUxvZyBmb3JtYXQKLSBuYW5vLmM6IAogIG1haW4oKTogCUJvdW5kIENPTlRST0xfSCB0byBiYWNrc3BhY2UgKG9vcHMpCgkJQWRkZWQgbW9yZSBBbHQtWy1rZXkgY29tYmluYXRpb25zLCBmb3IgcGFnZSB1cCAmIGRvd24uCiAgcmVhZF9ieXRlcygpOglOZXcgZnVuY3Rpb24gKEFkYW0gUm9nb3lza2kpCiAgcmVhZF9maWxlKCk6CU9wdGltaXphdGlvbnMgLSBtYWxsb2MoKXMgKmJ1ZiBhIGxpdHRsZSBhdCBhIHRpbWUgcmF0aGVyCgkJdGhhbiBvbmUgaHVnZSBidWZmZXIsIGFuZCByZXBsYWNlZCB0aGUgc3RyY2F0IGF0IHRoZSBlbmQKCQl3aXRoIGFuIGluZGV4IHZhcmlhYmxlLiAgQWRkZWQgY2FsbCB0byByZWFkX2J5dGVzKCkuCiAgZG9fbmV4dF93b3JkKCk6IE5ldyBmdW5jdGlvbiwgYmluZGluZyBpcyBjb250cm9sLXNwYWNlICgwKSAobWUpCgotIHdpbmlvLmM6IAogIGJvdHRvbWJhcnMoKToJRml4ZWQgbm9uLWV4cGFuZGluZyBzaG9ydGN1dCBrZXlzIGF0IGJvdHRvbSBvZiBzY3JlZW4uCgkJKGZvcm11bGEgaXMgZXh0cmEgc3BhY2UgbmVlZGVkID0gQ09MUyAvIDYgLSAxMykuCiAgYWN0dWFsX3goKSAmIHN0cmxlbnB0KCk6CQoJCUFkZGVkIGJ1ZyM5IGZpeCAtIHdoZW4gdGFicyAlIDggPT0gMCwgd2Ugc2hvdWxkIG9ubHkKCQlpbmNyZW1lbnQgdGFicyBieSAxLgogIHRpdGxlYmFyKCk6CUZpeGVkIG92ZXJydW4gaW4gdGl0bGViYXIgb24gdmVyeSBsb25nIGZpbGVuYW1lcy4KCjAuNy41CVBpY28gJ2xhc3QgbGluZScgZmVhdHVyZSBhZGRlZCAoUm9iIFNpZW1ib3Jza2kgJiBtZSkuICBFbGltaW5hdGVkCgl3cml0aW5nIGEgbmV3bGluZSBhdCBFT0YuIGRvX2N1cnNvcnBvcyBhbmQgZG9fcmVwbGFjZSBhcmUgbm93IG5vdAoJZGlyZWN0bHkgYm91bmQgdG8gc2lnbmFscyBidXQgcGlja2VkIHVwIGFzIHRoZWlyIGNvbnRyb2wgc2VxdWVuY2VzCglpbiByYXcgbW9kZS4gQnVnIGZpeCBpbiBkb19iYWNrc3BhY2UuIEZpeGVkIGJ1ZyAjOSAod29vaG9vISkKMC43LjQJT3B0aW1pemVkIChvYmZ1c2NhdGVkPykgZWRpdF9yZWZyZXNoLiBNYWxsb2MoKSBjYWxscyBjaGVja2VkIGZvcgoJYXZhaWxhYmxlIG1lbW9yeSwgYWxpZ24gYnVnIGZpeGVkIChCaWcgR2F1dGUpLgoKLS0tIEFzIG9mIHZlcnNpb24gMC43LjQgVElQIGlzIHJlbmFtZWQgdG8gbmFuby4KCjAuNy4zCUZpeGVkIGEgZG91YmxlIGJsYW5rX3N0YXR1c2JhcigpIHdoZW4ganVtcGluZyB0byBmaXJzdCBhbmQgbGFzdAoJbGluZXMuICBUb29rIG91dCB1bm5lY2Vzc2FyeSB1cGRhdGVzIGluIGxvYWRfZmlsZS4gQnVnIGZpeCBpbgoJZG9fbGVmdC4gTWlzc2luZyB1cGRhdGVzIHRvIHRvdGxpbmVzLCBmaXhlZCBidWcgIzcgKGxhc3QgbGluZSBub3QKCWhhdmluZyBhIG5ld2xpbmUgYXQgdGhlIGVuZCBkb2VzbnQgZ2V0IHJlYWQsIGJ1Z2ZpeCBpbiBkb19yZXBsYWNlCgl3aXRoIHJlcGxhY2UgYWxsLCBtb3JlL2JldHRlciBjb21tZW50cyAoUm9iZXJ0IFNpZW1ib3Jza2kpCjAuNy4yCU91ciBmaXJzdCBwYXRjaCBhY2NlcHRlZCBpbnRvIHRoZSBzb3VyY2UhIGNvbmZpZ3VyZSBmaXhlcyAKCWFuZCBvcHRpbWl6YXRpb25zIChFcmlrIEFuZGVyc29uKS4gIEFkZGVkIG1pc3Npbmcgc3RkYXJnLmggdG8gd2luaW8uYy4gCglCdWcgZml4IGluIHVwZGF0ZV9saW5lIGZvciBlZGl0aW5nIGxvbmcgbGluZXMuIEZpeGVkIGFyZ3VtZW50cwoJYmVpbmcgcHV0IGludG8gdGhlIGZpbGVuYW1lIHdoZW4gbm9uZSBpcyBzcGVjaWZpZWQuIFByZWxpbWluYXJ5CgkrbGluZSBjb21tYW5kIGFyZ3VtZW50IGZ1bmN0aW9uLgowLjcuMQljb25maWd1cmUgdHdlYWsgZm9yIGJldHRlciBGcmVlQlNEIHN1cHBvcnQuIFJlbW92ZWQgcmVmcmVzaCgpIGZyb20KCWVkaXRfcmVmcmVzaCB0byBzdG9wIGN1cnNvciAianVtcGluZyIgZHVyaW5nIHNjcmVlbiB1cGRhdGVzLiAgVGhpcwoJd2lsbCBwcm9iYWJseSBjYXVzZSBhIGJ1ZyBvciB0d28uIFJlcGxhY2UgaXMgbm93IEFsdC1SIChAUikgYW5kIAoJR290byBsaW5lIGlzIEFsdC1HIChARyksIGJ1dCB0aGV5IGhhdmUgY29udHJvbCBrZXkgYWxpYXNlcyBvZiBeXCBhbmQgCgleXyByZXNwZWN0aXZlbHkuICBNYWRlIENvbnRyb2wtRixCLE4sUCB3b3JrIGxpa2UgdGhleSBkbyBpbiBQaWNvLgoJQ29udHJvbC1HIHdpbGwgYmVjb21lIHRoZSBIZWxwIGtleSwgYnV0IGZvciBub3cgaXMgc3R1YmJlZCBvdXQuCjAuNy4wCUZpeGVkIG1pc3Npbmcgc3RkbGliLmggZnJvbSBjdXQuYy4gRml4ZWQgYSBmZXcgbWVzc2FnZSBidWdzIGluCglmaW5kbmV4dHN0ci4gQm91bmQgQ29udHJvbC1EIHRvIERlbGV0ZS4gUmVmaXhlZCBzZWdmYXVsdCBvbiB6ZXJvCglsZW5ndGggZmlsZS4gQWRkZWQgRXNjLVstQSxCLEMsRCBjdXJzb3Iga2V5IHNlcXVlbmNlcy4KMC42LjkJUHJlbGltaW5hcnkgY3Vyc29yIHBvc2l0aW9uIGZ1bmN0aW9uLiBTcGxpdCB1cCB0aXAuYyBtb3JlLCBtYWRlCgluZXcgZmlsZXMgY3V0LmMgYW5kIHdpbmlvLmMuIEZpeGVkIGEgYnVnIGluIGN1dF9tYXJrZWRfc2VnbWVudAoJdGhhdCB3YXMgbGVhdmluZyBvdXQgYSBjaGFyYWN0ZXIuCjAuNi44CUJ5IHJlcXVlc3QsIG9wdGNociBpbiBtYWluKCkgaXMgbm93IGFuIGludC4gIFJlbW92ZWQgdW5uZWVkZWQKCWdsb2JhbHMuIEJvdW5kIGZ1bmN0aW9ucyBmb3IgbmV4dC9wcmV2IHBhZ2UsIGFuZCB3cm90ZSBmdW5jdGlvbnMKCWRvX2hvbWUgYW5kIGRvX2VuZC4KMC42LjcJQnVnZml4IGluIGRvX3VuY3V0X3RleHQgZm9yIHRvdGxpbmVzLiBCcm9rZSB1cCBvcGVuX2ZpbGUgYW5kCgljcmVhdGVkIHJlYWRfZmlsZS4gIEltcGxlbWVudGVkIEluc2VydCBGaWxlLiBGaXhlcyBpbiB0aXBnZXRzdHIKCWZvciBlcnJvbmVvdXMga2V5c3Ryb2tlcy4gQWRkZWQgbGVhdmVfY3Vyc29yIGFyZyB0byBkb195ZXNubygpLgowLjYuNglGaXhlcyBpbiBkb19zZWFyY2goKSwgZG9fcmVwbGFjZSgpLCBkb193cml0ZW91dCwgYW5kIGRvX2V4aXQoKSBmb3IgCglhYm9ydGVkIHNlYXJjaGVzIGFuZCBtb3JlIFBpY28tY29tcGF0aWJsZSBtZXNzYWdlcy4gc3RhdHVzcSgpIG5vdwoJcmV0dXJucyAtMiBvbiBhIGJsYW5rIGVudHJ5IGluc3RlYWQgb2YgLTEuIEJ1ZyBmaXggaW4gYWN0dWFsX3goKS4KMC42LjUJTW9yZSBCU0QgY29tcGF0aWJpbGl0eS4gIEZpeGVkIHR3byBidWdzIGluIGRvX3VuY3V0X3RleHQKCXJlZ2FyZGluZyBidWZmZXJzIHdpdGggZmlsZWJvdCBpbiB0aGVtLiAgRml4aW5zIGluIGRvX2JhY2tzcGFjZQoJYW5kIGRvX2VudGVyLiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMuIFJlbW92ZWQgc3RyaXBfbmV3bGluZS4KMC42LjQJVG9vayBvdXQgdGhlIGF3ZnVsIG5ld2xpbmVzIGZyb20gZWFjaCBzdHJpbmcgYnVmZmVycy4gIFRoaXMgd2lsbAoJY2VydGFpbmx5IGNhdXNlIG1vcmUgYnVncy4gRml4ZXMgaW4gZG9fZXhpdCgpLiBCZXR0ZXIgZW1wdHkgZmlsZQoJaGFuZGxpbmcgKEkgaG9wZSkuCjAuNi4zCUltcGxlbWVudGVkIF5FLiAgUmVtb3ZlZCBub3cgdW5uZWVkZWQgd3JhcGxpbmUgZnJvbSBmaWxlc3RydWN0LgoJZG9fZW50ZXIoKSByZXdyaXR0ZW4uCjAuNi4yCUJldHRlciBkZWZhdWx0IGZpbGUgcGVybWlzc2lvbnMuIENvbXBsZXRlIHJld3JpdGUgb2YgZG9fd3JhcCgpLgoJQmV0dGVyIGhhbmRsaW5nIG9mIGVkaXRpbmcgd2l0aCBjdXJzb3IgbmVhciBDT0xTIC0gMS4KMC42LjEJU3RhcnRpbmcgdG8gaW1wbGVtZW50IHdyYXBwaW5nIHRvZ2dsZS4gRml4IGZvciB1bmhhbmRsZWQgY29udHJvbAoJY29kZXMgYmVpbmcgZW50ZXJlZCBpbnRvIHRoZSBidWZmZXIuIEJ1ZyBmaXggaW4gYWN0dWFsX3g7IG1vcmUKCT4gQ09MUyAtIDEgZnVuY3Rpb25hbGl0eSwgZXNwZWNpYWxseSBvbiBsaW5lcyB3aXRoIFRBQnMuICBGaXhlZCBiZWluZyAKCWxvY2tlZCBpbnRvIGN1dGJ1ZmZlciB3aGVuIGN1dHRpbmcgbW9yZSB0aGFuIG9uZSBtYXJrZWQgc2NyZWVuIG9mIHRleHQuCjAuNi4wCVdlIGhhdmUgVEFCcyEhISAgVG8gZG8gdGhpcywgcGxhY2V3ZXdhbnQgaXMgbm93IHNldCB0byB0aGUgYWN0dWFsCgl3aWR0aCBvbiB0aGUgc2NyZWVuIHdlIHdhbnQgdG8gYmUsIG5vdCBhbiBpbmRleCBvZiBjdXJyZW50LT5kYXRhLgoJTmV3IGZ1bmN0aW9ucyB4cGx1c3RhYnMgYW5kIGFjdHVhbF94IGNvbnZlcnQgdGhlIGFjdHVhbCBwbGFjZQoJdGhlIGN1cnNvciBzaG91bGQgYmUgb24gdGhlIHNjcmVlbiB0byBhbmQgZnJvbSB0aGUgcGxhY2UgaW4gdGhlCglzdHJpbmcuCjAuNS41CUNoYW5nZWQgZG9fcmlnaHQgdG8gdGVzdCBkb19kb3duIGJlZm9yZSBzZXR0aW5nIGN1cnJlbnRfeCB0byAwLAoJZWxpbWluaWF0aW5nIHRoZSAibG9vcGluZyIgb24gdGhlIGxhc3QgbGluZSB3aGVuIGhvbGRpbmcgdGhlIHJpZ2h0CglhcnJvdy4gIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGxvbmdlciB0aGFuIENPTFMgLSAxIGxpbmVzLgoJV3JvdGUgZG9fZGVsZXRlLgowLjUuNAlGaXhlZCBhIGJpZyBpbiB0b3RhbF91cGRhdGUgdGhhdCB3YXNuJ3QgcmVwYWludGluZyB0aGUgc2NyZWVuIHByb3Blcmx5LgoJdGlwZ2V0c3RyIGlzIG11Y2ggbW9yZSBtZXNzeSBidXQgdGV4dCBpcyBub3cgbW9yZSBlZGl0YWJsZSA7KQoJRml4ZWQgY3Jhc2ggb24gZW50ZXJpbmcgYSBuZXcgZmlsZSwgaG9wZWZ1bGx5LiBBd2Z1bCBzdHViIGZvciB0YWIKCWhhbmRsaW5nLCBvbmx5IGluIGRvX3JpZ2h0KCkgdG8gc2F2ZSBtZSBzb21lIHNhbml0eS4KMC41LjMJQWRkZWQgY2hlY2sgZm9yIG1hbGxvYy5oLiAgSW1wbGVtZW50aW5nIHVuY3V0IGZyb20gbWFya2VyIHNsb3dseS4KCUZpeGVkIGEgZmV3IGJ1Z3MgaW4gZG9fdW5jdXQgd2hlbiBub3QgdW5jdXR0aW5nIGZyb20gbWFya2VkIHRleHQuCiAgICAgICAgSSB3b3VsZCBub3QgdHJ1c3QgeW91ciBkYXRhIHdpdGggdGhlIG1hcmsgY29kZSByaWdodCBub3csIGJ1dCB0aGVuCiAgICAgICAgd2UncmUgbm90IGF0IHZlcnNpb24gMS4wIHlldCBzbyBkb250IHRydXN0IGFueXRoaW5nIDspCjAuNS4yCUFkZGVkIHJlc2V0X2N1cnNvcigpIGJlZm9yZSBlbmQgb2YgdXBkYXRlX2xpbmUgc28gY3Vyc29yIGRvZXNudAoJanVtcCBhZnRlciBlYWNoIGtleXN0cm9rZSBlbnRlcmVkLiBTZWxlY3QgdGV4dCBzdHViYmVkLiBGaXhlZAoJYSBidWcgaW4gdG90YWxfcmVmcmVzaCgpLiAgU2V0dGluZyBhIG1hcmsgd2lsbCBoaWxpZ2h0IHByb3Blcmx5LAoJYnV0IGRvZXMgbm90IGFjdHVhbGx5IGFmZmVjdCB3aGF0IGdldHMgcHV0IGluIHRoZSBjdXRidWZmZXIgKHlldCkuCjAuNS4xCVdyaXRpbmcgYSBmaWxlIG91dCBjYXVzZXMgbW9kaWZpZWQgdG8gYmUgc2V0IGJhY2sgdG8gMC4gIEdvb2QuCglTZXRfbW9kaWZpZWQgZnVuY3Rpb24gd3JpdHRlbi4gIEN1dCBhbmQgdW5jdXQgdGV4dCBub3cgc2V0Cgltb2RpZmllZCB3aGVuIGNhbGxlZC4KMC41LjAJSGFsZiB3YXkgdGhlcmUhICBJbXBsZW1lbnRlZCB3cml0ZSBvdXQsIHNhdmUgZnVuY3Rpb24gc2VlbXMKCXN0YWJsZS4gIENoYW5nZWQgc3RhdHVzYmFyIGJsYW5rIHJvdXRpbmcgdG8gbm90IHJlZnJlc2gsIGEgc2VwYXJ0ZQoJcHJvZ3JhbSBjYWxscyBpdCBhbmQgdGhlbiByZWZyZXNoZXMuICBNYWRlIHRoZSBwcm9ncmFtIG5vdCBjbGVhcgoJdGhlIHNyY2VlbiBvbiBleGl0LCBqdXN0IHRoZSBib3R0b20gdHdvIGxpbmVzIChsaWtlIFBpY28pLgowLjQuMglJbXBsZW1lbnRlZCByZXBsYWNlIGFsbCBpbiByZXBsYWNlIGZ1bmN0aW9uLiAgQ3J1ZGUgZXhpdCBmdW5jdGlvbgoJKGFza3MgeWVzIG9yIG5vIGlmIG1vZGlmaWVkIGJ1dCBkb2VzIG5vdCB3cml0ZSB0byBmaWxlKS4KMC40LjEJSW1wbGVtZW50aW5nIHNlYXJjaCAmIHJlcGxhY2UuICBGaXhlZCBjcmFzaCBvbiBkZWxldGluZyBhdCB0b3Agb2YKCWVkaXQgYnVmZmVyLiAgSW1wbGVtZW50ZWQgInRpbWVvdXQiIG9mIHN0YXR1c2JhciBtZXNzYWdlcy4KCUltcGxlbWVudGVkIF5BIGFuZCBeRSAoYmVnaW5uaW5nIGFuZCBlbmQgb2YgbGluZSkuCjAuNC4wCVNwbGl0IGNvZGUgaW50byBnbG9iYWwuYyBhbmQgcHJvdG8uaCB0byBhbGxvdyBmb3IgYmV0dGVyIG11bHRpcGxlCglmaWxlIGhhbmRsaW5nLiAgQWRkZWQgI2RlZmluZXMgZm9yIHRoZSBtYWpvcml0eSBvZiB0aGUgc2hvcnRjdXQKCWtldHMgaW4gdGlwLmggZm9yIGVhc3kgbW9kaWZpY2F0aW9uLiAKMC4zLjEJV3JpdGUgZWRpdF9yZWZyZXNoIHdoaWNoIGRvZXNuJ3QgbW92ZSB0aGUgc2NyZWVuIGFyb3VuZCwganVzdAoJdXBkYXRlcyB3aGF0J3MgdGhlcmUgYWxyZWFkeS4gIGRvX3dyYXAoKSBhbmQgZG9fZW50ZXIoKSBhZGRlZC4KMC4zLjAJUHJlbGltaW5hcnkgY3V0YnVmZmVyIChjdXQgYW5kIHVuY3V0KSBzdXBwb3J0LgowLjIuNyAgIENoZWNrIGZvciBNb2RpZmljYXRpb24gYWRkZWQuICBkb19zZWFyY2goKSB3b3Jrcy4KMC4yLjUJUmV3cml0ZSBvZiBmaWxlIGRhdGEgc3RydWN0LgowLjIJUmVhZCBpbiBkYXRhIHRvIGJ1ZmZlciwgYm91bmQga2V5c3Ryb2tlcyB0byBzdHViIGZ1bmN0aW9ucywgCglpbml0aWFsIGN1cnNvciBtb3ZlbWVudCBvbiBzY3JlZW4uICBJbml0aWFsIGF1dG9jb25mIHN1cHBvcnQuCjAuMQlJbml0aWFsIHByb2dyYW0gc2V0dXAgdy9uY3Vyc2VzCg==